创建单个子进程

  • Post author:
  • Post category:其他



一.创建进程函数介绍:

#include<unistd.h>
pid_t pid = fork(void);

1.pid_t 是描述进程id的,是进程号类型,pid_t 在头文件types.h(sys/types.h)中有定义;

2.fork()函数用于创建子进程,创建之后会有两个进程:

返回值: (1)父进程中的fork()函数返回子进程 id ( 非负整数 > 0);

(2)新创建的子进程中的fork()函数返回值:若为 0,则创建成功;若为-1,则创建失败;

—  则我们可以根据返回值来区分父子进程;

3.其余的一些函数

pid_t getpid(void);    //得到当前进程的 id 号
pid_t getppid(void);    //得到当前进程的父进程的 id 号


二.实例介绍

#include"stdio.h"
#include"stdlib.h"
#include"unistd.h"

int main(){

        pid_t pid;
        printf("Begin...\n");
        pid = fork();

        if(pid == -1){    // pid 值为-1,则创建子进程失败
                perror("fork error!");
                exit(1);
        }
        else if(pid == 0){    // pid 值为0,则创建子进程成功
                printf("i am child,pid = %u,ppid = %u\n",getpid(),getppid());
        }
        else{    // pid 值为非负整数,则为父进程
                printf("i am parent,pid = %u,ppid = %u\n",getpid(),getppid());
                sleep(1);    // 防止 bash进程 的干扰
        }

        return 0;
}


三.实例分析

1.针对这个结果,首先fork()函数创建子进程,返回子进程 id>0,则输出 pid >0 条件下语句:

pid为子进程的 id ,但是 ppid 很多人会有疑问(认为父进程怎么还会有ppid)???

执行下列语句并查看结果截图

ps aux | grep 2279    // 查看id号为 2279 的进程

可知,父进程的父进程是 bash/shell

2.子进程的输出和我们预想的一样

3.sleep()的应用原因:

先执行将sleep()注释掉的代码多次编译并执行,结果如下

#include"stdio.h"
#include"stdlib.h"
#include"unistd.h"

int main(){

        pid_t pid;
        printf("Begin...\n");
        pid = fork();

        if(pid == -1){
                perror("fork error!");
                exit(1);
        }
        else if(pid == 0){
                printf("i am child,pid = %u,ppid = %u\n",getpid(),getppid());
        }
        else{
                printf("i am parent,pid = %u,ppid = %u\n",getpid(),getppid());
        //      sleep(1);
                printf("parent goes to die!\n");
        }
        printf("End...\n");

        return 0;
}

可知,结果的显示有所不同:

此时,我们可知当前进程有三个,bash-parent-child,父进程去世之后,bash作为父进程的父进程,对其进行回收,与子进程争夺 cpu 资源,造成结果显示不可控,可以利用sleep(i),i为睡眠秒数,让父进程睡眠一会儿再去世防止这种状况—>因而,使用sleep() 函数。


注:

1.使用 sleep() 函数使父进程阻塞等待子进程执行,控制进程间的执行顺序,只是一种权益之计,在实际应用中,很难使用这种方法在保证效率的前提下,精确地实现进程同步。

2.Linux系统中提供了 wait() 和 waitpid() 函数,来获取进程状态,实现进程同步。


参考资料:

1.

B站—Linux全套教程


写在最后:

该博客是本人学习的一些总结,如果各位有不同见解,可以评论提出或者与我联系改正,谢谢大家!!!



版权声明:本文为qq_45830251原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。