• 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个子进程

  • 相关阅读:
    使用Newtonsoft进行JSON序列化时将枚举序列化为字符串的方法
    通过javac导出Jar包
    JAVA中JDBC连接Mysql数据库简单测试
    使用Swashbuckle.AspNetCore生成.NetCore WEBAPI的接口文档
    CentOS7中使用yum安装Nginx的方法
    Dockerfile 指令 ADD 和 COPY介绍
    Azure Web应用中设置静态虚拟目录的方法(比如部署Django需要用到)
    pip常用命令(转载)
    android发布新版忘记keystore(jks)密码终极解决方案
    IntelliJ Idea 常用快捷键列表
  • 原文地址:https://www.cnblogs.com/qiangz/p/15844749.html
Copyright © 2020-2023  润新知