创建单个子进程

一.创建进程函数介绍:

#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全套教程


写在最后:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

S_h_a_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值