LIinux下C语言进程管理
正常结束的子进程
#include<stdio.h>#include <unistd.h>#include <sys/types.h>#include <signal.h>#include<sys/wait.h> int main(){pid_t childpid;int status;printf("Hello World!清空缓冲区!\n");?? //如果没有\n,则这句会出现两次!childpid=fork();if(childpid==0) printf("\t\t\t||");printf("fork! 该进程getpid()=%d,childpid=%d\n",getpid(),childpid);if(childpid<0){printf("fork fail!\n");return -1;}else if(childpid==0){puts("\t\t\t||子进程信息:");printf("\t\t\t||pid=%d\tppid=%d\n",getpid(),getppid());//while(true)//{sleep(1);}printf("\t\t\t||子进程要睡3秒!\n");sleep(3);printf("\t\t\t||子进程要结束啦!\n");return 0;}else{puts("父进程信息:");printf("pid=%d\tppid=%d\n",getpid(),getppid());printf("waitpid 方法返回 %d,因此子进程正在运行..status=%d\n",waitpid(childpid,NULL,WNOHANG),status);printf("挂起父进程,等候子进程!\n");waitpid(childpid,&status,0);printf("waitpid 方法返回 %d,因此子进程已经结束!status=%d\n",waitpid(childpid,NULL,WNOHANG),status);}return 0;}?
运行结果
#include<stdio.h>#include <unistd.h>#include <sys/types.h>#include <signal.h>#include<sys/wait.h> int main(){pid_t childpid;int status;int re;printf("Hello World!清空缓冲区!\n");childpid=fork();if(childpid==0) printf("\t\t\t||");printf("fork! 该进程getpid()=%d,childpid=%d\n",getpid(),childpid);if(childpid<0){printf("fork fail!\n");return -1;}else if(childpid==0){puts("\t\t\t||子进程信息:");printf("\t\t\t||pid=%d,ppid=%d\n",getpid(),getppid());printf("\t\t\t||子进程要死循环!\n");while(1);printf("\t\t\t||子进程要结束啦!\n");return 0;}else{puts("父进程信息:");printf("pid=%d,ppid=%d\n",getpid(),getppid());printf("waitpid 方法返回 %d,因此子进程正在运行..status=%d\n",waitpid(childpid,NULL,WNOHANG),status); ?puts("父进程睡3秒 ZZzz..");sleep(3);puts("父进程发现子进程在捣蛋!杀了它!");re=kill(childpid,SIGINT);if(re==0) puts("父进程挥泪斩马谡!子进程被杀 T T");else if(re==-1) puts("我去!虎毒不食子!父进程下不了手!");re=waitpid(childpid,NULL,WNOHANG);if(re==-1) printf("waitpid 方法返回 %d,因此子进程乃正常死亡!status=%d\n",re,status);else if(re==0) printf("waitpid 方法返回 %d,因此子进程乃[非]正常死亡!status=%d\n",re,status);}return 0;}?程序运行结果
写道Hello World!清空缓冲区!fork! 该进程getpid()=3225,childpid=3226
父进程信息:
pid=3225,ppid=3109
waitpid 方法返回 0,因此子进程正在运行..status=134514464
父进程睡3秒 ZZzz..
||fork! 该进程getpid()=3226,childpid=0
||子进程信息:
||pid=3226,ppid=3225
||子进程要死循环!
父进程发现子进程在捣蛋!杀了它!
父进程挥泪斩马谡!子进程被杀 T T
waitpid 方法返回 0,因此子进程乃[非]正常死亡!status=134514464
?
?
一些Tips:
?
1.http://www.chinaunix.net/old_jh/23/907131.html
一般,如果父进程退出后,子进程的PPID就会变成1,(因为父进程不存在了)
所以,可以在子进程中判断:if(1?==?getppid())
就说明主进程退出了
?
2.http://topic.csdn.net/u/20080730/12/52c12489-55f2-49a1-891d-76e882921856.html
?
3.http://zhidao.baidu.com/question/371085775.html&__bd_tkn__=64f55a272c649b2d573da233b4a123b1830dd5fb8078338d51fed8133ea5c69d362ad36bb4bcda3b39bb3949f6bbe47087ac3af56e60b1f4e7eb60157b5bfc329562aeff5b0f03de01252775a130b80c48059e077b28cf88a649407b005a3328b8127c3149bdadd99506faaccbdc8c0bc93523f74da1
?
4.http://baike.baidu.com/view/22085.htm#4
kill(传送信号给指定的进程,使用 kill -l 命令可查看linux系统中信号。)
相关函数 raise,signal
表头文件 #include<sys/types.h> #include<signal.h>
定义函数 int kill(pid_t pid,int sig);
函数说明
kill()可以用来送参数sig指定的信号给参数pid指定的进程。
参数pid有几种情况:
pid>0 将信号传给进程识别码为pid 的进程。
pid=0 将信号传给和目前进程相同进程组的所有进程
pid=-1 将信号广播传送给系统内所有的进程
pid<0 将信号传给进程组识别码为pid绝对值的所有进程
返回值 执行成功则返回0,如果有错误则返回-1。
?
5.http://baike.baidu.com/view/2365304.htm
waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。
如果在调用 waitpid()时子进程已经结束,则 waitpid()会立即返回子进程结束状态值。
子进程的结束状态值会由参数 status 返回, 而子进程的进程识别码也会一起返回。
如果不在意结束状态值,则 参数 status 可以设成 NULL。
参数 pid 为欲等待的子进程识别码,其他数值意义如下:
pid<-1 等待进程组识别码为 pid 绝对值的任何子进程。
pid=-1 等待任何子进程,相当于 wait()。
pid=0 等待进程组识别码与目前进程相同的任何子进程。
pid>0 等待任何子进程识别码为 pid 的子进程。
如果执行成功则返回子进程识别码(PID) ,如果有错误发生则返回返回值-1。失败原因存于 errno 中。(未解决!)
?
6.http://doc.linuxpk.com/53457.html
?
?