一.创建进程函数介绍:

#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;
}

Android中创建三个子进程进行调用接口并完成数据传输 创建一个子进程_父进程


三.实例分析

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

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

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

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

Android中创建三个子进程进行调用接口并完成数据传输 创建一个子进程_子进程_02

   可知,父进程的父进程是 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;
}

Android中创建三个子进程进行调用接口并完成数据传输 创建一个子进程_子进程_03

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

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


注:

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

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


参考资料:

1.B站---Linux全套教程