1、如何创建一个新的进程:
使用fork()函数:
使用fork函数可以产生一个与父进程一模一样的新的进程,称为子进程,同时两个进程之间可以执行不同的任务。
#include <stdio.h>
int main()
{
int aa = 0;
printf("I am process pid=%d ppid=%d\n", getpid(),getppid() );
/*
int fork();
*/
int pid = fork();
if(pid >0){
while(1){
aa++;
printf("I am father pid=%d ppid=%d\n",getpid(),getppid());
sleep(1);
}
}else if(pid==0){
while(1){
printf("I am child pid=%d ppid=%d\n",getpid(),getppid());
printf("child aa=%d\n",aa);
sleep(1);
}
}
}
2、如何将创建的进程释放:
使用exit()函数结束进程,但是在结束进程之后,进程并没有被完全回收,会成为一个僵尸进程,需要等待父进程去完全回收释放。
#include <stdio.h>
int main()
{
int aa = 0;
printf("I am process pid=%d ppid=%d\n", getpid(),getppid() );
/*
int fork();
*/
int pid = fork();
if(pid >0){
while(1){
aa++;
printf("I am father pid=%d ppid=%d\n",getpid(),getppid());
sleep(1);
exit(0);
}
}else if(pid==0){
while(1){
printf("I am child pid=%d ppid=%d\n",getpid(),getppid());
printf("child aa=%d\n",aa);
sleep(1);
}
}
}
3、父进程对子进程进行完全回收释放:
使用wait()函数,在对wait()函数的使用中,如果子进程已经自己释放了自己,则父进程直接对子进程进行完全释放,如果子进程没有对自己进行释放,则父进程会被阻塞等待子进程的释放,再进行完全释放。
父进程调用wait,阻塞(卡在那里)的等待 任意子进程结束,
一旦某个子进程结束,wait立马返回,获取孩子的进程号和死亡状态,并完成收尸过程
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
status存放 子进程exit()传参
exit的传参是一个 char数据,存放在了 wait参数的8-15bit
返回值: 死亡孩子的pid
用法: 一般当父进程想自我了解的时候,最后一步调用wait ,当所有子进程结束,父进程结束.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
printf("main process pid=%d\n",getpid());
pid_t pid = fork();
if(pid<0){
perror("fork err");
return -3;
}
if(pid==0){
printf("sub process pid=%d ppid=%d\n",getpid(),getppid());
int n=5;
while(1){
n--;
if(n==0){ exit( 11 );} //自杀,向父亲传递一个值
printf("I am 1st subprocess \n");
sleep(1);
}
}
int dead_stat;
pid_t subpid = wait(&dead_stat);
printf("find subprocess %d stat=%d\n",subpid, (dead_stat&0xFF00)>>8);
return 0;
}