一.创建进程函数介绍:
    
   
#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全套教程
    
   
    写在最后:
   
该博客是本人学习的一些总结,如果各位有不同见解,可以评论提出或者与我联系改正,谢谢大家!!!
 
