读书人

LIinux上C语言进程管理

发布时间: 2012-11-09 10:18:48 作者: rapoo

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

第一句话如果有\n清空了缓冲区  所谓子进程内存中就没有该字符串第一句话如果没有\n 字符串还留在缓冲区内,子进程复制了父进程的内存,所以有这个字符串

?

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

?

?

读书人网 >C语言

热点推荐