//创建进程
#include <stdio.h>
#include <unistd.h>
//父子进程共享同一段代码,但在不同的内存结构中
int gval=10;
int main(int argc,char *argv[])
{
pid_t pid;
int lval=20;
gval++,lval+=5;
pid=fork(); //调用fork函数床创建进程,父进程返回子进程的ID 子进程返回0
if(pid==0)
gval+=2,lval+=2;
else
gval-=2,lval-=2;
if(pid==0)
printf("Child Proc: [%d,%d] \n",gval,lval);
else
printf("Parent Proc: [%d,%d]\n",gval,lval);
return 0;
}
//创建僵尸进程
#include <stdio.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
pid_t pid=fork();
if(pid==0)
{
puts("Hi,I am a child process");
}
else
{
printf("Child Process ID: %d \n",pid);
sleep(30);
}
if(pid==0)
puts("End child process");
else
puts("End parent process");
return 0;
}
//销毁僵尸进程wait
#include <stdio.h>
#include <sys/wait.h> //因为要调用wait()函数,销毁子进程要由父进程主动管理,wait函数可能会引起阻塞
#include <unistd.h> //exit,return的返回值将传递给操作系统,而操作系统不会销毁子进程,直到把这些值传递给产生该子进程的父进程
#include <stdlib.h> //所以产生僵尸进程的正是操作系统
//如果父进程终止,处于僵尸状态的子进程将同时销毁
int main()
{
int status;
pid_t pid=fork();
if(pid==0)
{
return 3;
}
else
{
printf("Child One PID: %d \n",pid);
pid=fork();
if(pid==0)
{
exit(7);
}
else
{
printf("Child Two PID: %d \n",pid);
wait(&status); //利用wait()函数销毁僵尸进程
printf("status:%d \n",status); //单独输出status并没什么意义,&status指向的单元还包含其他信息
wait(&status); //利用wait()函数销毁僵尸进程
printf("status:%d \n",status);
/* if(WIFEXITED(status))
printf("Child one send: %d \n",WEXITSTATUS(status));
wait(&status);
if(WIFEXITED(status))
printf("Child two send: %d \n",WEXITSTATUS(status));
*/
sleep(30);
}
}
return 0;
}
//销毁僵尸进程waitpid
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
int status;
pid_t pid=fork();
if(pid==0)
{
sleep(15);
return 24;
}
else
{
while(!waitpid(-1,&status,WNOHANG)) //-1可以等待任意子进程终止,WNOHANG即使没有终止的子进程也不会阻塞而是返回0并退出函数
{ //成功时返回终止的子进程ID,失败返回-1
sleep(3);
puts("sleep 3sec.");
}
if(WIFEXITED(status))
printf("Child send %d \n",WEXITSTATUS(status));
}
return 0;
}