Linux系统编程 —— 进程控制

for()函数使用

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
    int i;
    pid_t pid;
    printf("pragram is running ...");

    // 创建子进程
    pid = fork();

    if (pid == -1){
        // 异常
        printf("fork error !!!");
        exit(1);
    } else if (pid == 0) {
        // 子进程逻辑
        break;
    } else if (pid > 0) {
        // 父进程逻辑
    }


    return 0;
}

正确创建N个子进程

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
    int i;
    pid_t pid;
    printf("pragram is running ...");

    for (int i = 0; i < 5; i++) {
        pid = fork();
        if (pid == -1){
            // error
            printf("fork error !!!");
            exit(1);
        } else if (pid == 0) {
            // 子进程逻辑
            break;
        } else if (pid > 0) {
            // 父进程逻辑
        }
    }

    sleep(i); // 保证输出顺序
    if (i < 5) {
        printf("I'am child %d , pid = %u\n", i + 1, getpid());
    } else {
        printf("I'am parent\n");
    }

    return 0;
}

父子进程相同处:全局变量、栈、堆、环境变量、用户ID、宿主目录、进程工作目录、信号处理方式、.data、.text...

父子进程不同处:进程ID、fork()返回值、父进程ID、进程运行时间、定时器、未决信号集

父子进程间遵循 读时共享,写时复制

注意误区:刚fork()之后相同处不代表共享,比如:父子进程的全局变量不共享。

父子进程共享:1.文件描述符(打开文件结构体)  2.mmap建立的映射区(进程间通信)

父子进程fork之后先后执行顺序不确定,取决于内核所使用的调度算法随机争夺。

gdb调试

> gcc main.c -g
> gdb a.out
命令
list                          列出代码设置断点,简写l
breakpoint <行号>             设置断点
breakpoint <行号> [if <条件>]  条件断点
next                          下一步
run                           运行
start                         单步执行
print <变量>                   打印变量值
set follow-fork-mode child    设置gdb在fork之后跟踪子进程(fork调用前设置生效)
set follow-fork-mode parent   设置gdb在fork之后跟踪父进程(fork调用前设置生效)

猜你喜欢

转载自blog.csdn.net/Necrolic/article/details/105747963