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