C语言linux系统fork函数

References:

  1. c语言fork函数
  2. linux中fork()函数详解

一、fork函数简介

  1. 作用

在linux下,C语言创建进程用fork函数。fork就是从父进程拷贝一个新的进程出来,子进程和父进程的进程ID不同,但用户数据一样。fork函数被父进程调用一次,但是却返回两次;一次是返回到父进程,一次是返回到新创建的子进程。

  1. 父进程和子进程的区分

执行fork函数后有2种返回值:对于父进程,返回的是子进程的PID(即返回一个大于0的数字);对于子进程,则返回0,所以我们可以通过pid这个返回值来判断当前进程是父进程还是子进程。

二、创建一个子进程的示例

  • 程序代码:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char* argv[]){
        printf("Before fork!\n");
        pid_t pid = fork();
        printf("pid value: %d\n", pid);
        printf("After fork!\n");
        if(pid > 0){
                printf("Parent process, pid: %d\n", getpid());
        }else if(pid == 0){
                printf("Child Process, pid: %d, parent pid: %d\n", getpid(), getppid());
        }else{
                printf("Fork failed!\n");
        }
        printf("Process end!\n");
        sleep(1);
        return 0;
}
  • 对应输出:

三、循环创建子进程

1.以下方式将创建7个子进程

  • 程序:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char* argv[]){
        printf("Before fork!\n");
        pid_t pid;
        for(int i = 0; i < 3; i++){
                pid = fork();
        }
        printf("pid value: %d\n", pid);
        printf("After fork!\n");
        if(pid > 0){
                printf("Parent process, pid: %d\n", getpid());
        }else if(pid == 0){
                printf("Child Process, pid: %d, parent pid: %d\n", getpid(), getppid());
        }
        printf("Process end!\n");
        sleep(1);
        return 0;
}

  • 运行结果:

创建了7个子进程

  • 图解如图所示:

2.如何循环三次得到三个子进程?

  • 不让子进程fork出新的子进程。
#include <stdio.h>
#include <unistd.h>
int main(int argc, char* argv[]){
        printf("Before fork!\n");
        pid_t pid;
        for(int i = 0; i < 3; i++){
                pid = fork();
                if(pid == 0) break;
        }
        printf("pid value: %d\n", pid);
        printf("After fork!\n");
        if(pid > 0){
                printf("Parent process, pid: %d\n", getpid());
        }else if(pid == 0){
                printf("Child Process, pid: %d, parent pid: %d\n", getpid(), getppid());
        }
        printf("Process end!\n");
        sleep(1);
        return 0;
}
  • 运行结果:

创建了3个子进程

posted on 2022-01-25 22:55  七昂的技术之旅  阅读(897)  评论(0编辑  收藏  举报

导航