创建进程,销毁僵尸进程

来源:互联网 发布:金字塔软件使用说明书 编辑:程序博客网 时间:2024/06/07 14:35
//创建进程
#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 子进程返回0if(pid==0)gval+=2,lval+=2;elsegval-=2,lval-=2;if(pid==0)printf("Child Proc: [%d,%d] \n",gval,lval);elseprintf("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");elseputs("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,失败返回-1sleep(3);puts("sleep 3sec.");}if(WIFEXITED(status))printf("Child send %d \n",WEXITSTATUS(status));}return 0;}