要子进程干活,检查活干完了,还是没完(abort还是被杀死了)
父进程等待子进程退出 并收集子进程的退出状态
子进程退出状态不被收集,变成僵死进程(僵尸进程)
#include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> int main() { pid_t pid; int cnt = 0; pid = vfork(); if(pid > 0){ while(1){ printf("father print , pid = %d\n",getpid()); printf("cnt = %d\n",cnt); sleep(1); } }else if(pid == 0){ while(1){ printf("son print , pid = %d\n",getpid()); sleep(1); cnt++; if(cnt == 5){ exit(0); } } } return 0; }
CLC@Embed_Learn:~/2_jingCheng$ gcc demo12.c -o newpro CLC@Embed_Learn:~/2_jingCheng$ CLC@Embed_Learn:~/2_jingCheng$ CLC@Embed_Learn:~/2_jingCheng$ ./newpro son print , pid = 30749 son print , pid = 30749 son print , pid = 30749 son print , pid = 30749 son print , pid = 30749 father print , pid = 30748 cnt = 5 father print , pid = 30748 cnt = 5 father print , pid = 30748 cnt = 5 father print , pid = 30748 cnt = 5 father print , pid = 30748 cnt = 5 father print , pid = 30748 cnt = 5
CLC@Embed_Learn:~$ ps -aux|grep newpro Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html CLC 30748 0.0 0.0 4160 428 pts/27 S+ 13:01 0:00 ./newpro CLC 30749 0.0 0.0 0 0 pts/27 Z+ 13:01 0:00 [newpro] <defunct> CLC 30820 0.0 0.0 13588 940 pts/31 S+ 13:02 0:00 grep --color=auto newpro
子进程pid = 30749 , Z+表示僵尸进程
区别: waitpid使调用者阻塞,waitpid有一个选项,可以使调用者不阻塞
include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> int main() { pid_t pid; int status = 10; int cnt = 0; pid = fork(); if(pid > 0){ wait(&status); printf("child quit, status = %d\n",WEXITSTATUS(status)); while(1){ printf("father print , pid = %d\n",getpid()); printf("cnt = %d\n",cnt); sleep(1); } }else if(pid == 0){ while(1){ printf("son print , pid = %d\n",getpid()); sleep(1); cnt++; if(cnt == 5){ exit(3); } } } return 0; }
CLC@Embed_Learn:~/2_jingCheng$ ./a.out son print , pid = 30946 son print , pid = 30946 son print , pid = 30946 son print , pid = 30946 son print , pid = 30946 child quit, status = 3 father print , pid = 30945 cnt = 0 father print , pid = 30945 cnt = 0 father print , pid = 30945 cnt = 0 father print , pid = 30945
进程:没有僵尸进程
CLC@Embed_Learn:~$ ps -aux|grep ./a.out Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html CLC 30945 0.0 0.0 4156 348 pts/27 S+ 13:10 0:00 ./a.out CLC 30946 0.0 0.0 4160 84 pts/27 S+ 13:10 0:00 ./a.out CLC 30948 0.0 0.0 13588 952 pts/31 S+ 13:10 0:00 grep --color=auto ./a.out
status参数: 是一个整型数指针
非空: 子进程退出状态放在它所指向的地址中。
空: 不关心退出状态
#include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> int main() { pid_t pid; int status = 10; int cnt = 0; pid = fork(); if(pid > 0){ waitpid(pid,&status,WNOHANG); printf("child quit, status = %d\n",WEXITSTATUS(status)); while(1){ printf("father print , pid = %d\n",getpid()); printf("cnt = %d\n",cnt); sleep(1); } }else if(pid == 0){ while(1){ printf("son print , pid = %d\n",getpid()); sleep(1); cnt++; if(cnt == 5){ exit(3); } } } return 0; }
CLC@Embed_Learn:~/2_jingCheng$ ./a.out child quit, status = 0 father print , pid = 31060 cnt = 0 son print , pid = 31061 son print , pid = 31061 father print , pid = 31060 cnt = 0 son print , pid = 31061 father print , pid = 31060 cnt = 0 father print , pid = 31060 cnt = 0 son print , pid = 31061
CLC@Embed_Learn:~$ ps -aux|grep a.out Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html CLC 31060 0.0 0.0 4160 352 pts/27 S+ 13:19 0:00 ./a.out CLC 31061 0.0 0.0 4160 88 pts/27 S+ 13:19 0:00 ./a.out CLC 31063 0.0 0.0 13588 948 pts/31 S+ 13:19 0:00 grep --color=auto a.out
父进程如果不等待子进程退出,在子进程之前就结束了自己的“生命”,此时子进程叫做孤儿进程。
Linux避免系统存在过多孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程。