标签:技术 返回 col sig options 阻塞 进程睡眠 printf use
waitpid(等待子进程中断或结束)
相关函数 wait,fork
1 #include <sys/types.h> 2 #include <sys/wait.h> 3 pid_t waitpid(pid_t pid,int * status,int options);
wait(等待子进程中断或结束)
相关函数 waitpid,fork
1 #include <sys/types.h> 2 #include <sys/wait.h> 3 pid_t wait (int * status);
process_wait.c
1 #include <sys/types.h> 2 #include <sys/wait.h> 3 #include <unistd.h> 4 #include <stdio.h> 5 #include <stdlib.h> 6 7 8 void out_status(int status) 9 { 10 if(WIFEXITED(status)) { 11 printf("normal exit: %d\n", WEXITSTATUS(status)); 12 } else if(WIFSIGNALED(status)) { 13 printf("abnormal term: %d\n", WTERMSIG(status)); 14 } else if(WIFSTOPPED(status)) { 15 printf("stopped sig: %d\n", WSTOPSIG(status)); 16 } else { 17 printf("unkown sig\n"); 18 } 19 } 20 21 int main(void) 22 { 23 int status;//存储子进程终止返回的状态 24 pid_t pid; 25 26 /* 正常终止 */ 27 if((pid = fork()) < 0) { 28 perror("fork error"); 29 exit(1); 30 } else if(pid == 0) { 31 printf("pid: %d, ppid: %d\n", getpid(), getppid()); 32 exit(3);//子进程终止运行 33 } 34 35 //父进程调用wait函数阻塞,等待子进程结束并回收 36 wait(&status); 37 out_status(status); 38 printf("==========================\n"); 39 40 /* 非正常终止 */ 41 if((pid = fork()) < 0) { 42 perror("fork error"); 43 exit(1); 44 } else if(pid == 0) { 45 printf("pid: %d, ppid: %d\n", getpid(), getppid()); 46 int i = 3; 47 int j = 0; 48 int k = i / j; 49 printf("k: %d\n", k); 50 } 51 52 wait(&status); 53 out_status(status); 54 printf("==========================\n"); 55 56 /* 暂停 */ 57 if((pid = fork()) < 0) { 58 perror("fork error"); 59 exit(1); 60 } else if(pid == 0) { 61 printf("pid: %d, ppid: %d\n", getpid(), getppid()); 62 pause();//暂停,即为阻塞,等待一个信号将它继续运行 63 /* 64 int i = 0; 65 while(++i > 0) sleep(3);*/ 66 } 67 68 wait(&status); 69 out_status(status); 70 71 return 0; 72 }
编译运行:
另开一终端,对进程发出停止信号发现无法停止:
这是因为 WIFSTOPPED(status) 和 WSTOPSIG(status) 必须在使用 waitpid 的 option 参数 WUNTRACED 时候才生效,wait 函数无此功能
process_waitpid.c
1 #include <sys/types.h> 2 #include <sys/wait.h> 3 #include <unistd.h> 4 #include <stdio.h> 5 #include <stdlib.h> 6 7 8 void out_status(int status) 9 { 10 if(WIFEXITED(status)) { 11 printf("normal exit: %d\n", WEXITSTATUS(status)); 12 } else if(WIFSIGNALED(status)) { 13 printf("abnormal term: %d\n", WTERMSIG(status)); 14 } else if(WIFSTOPPED(status)) { 15 printf("stopped sig: %d\n", WSTOPSIG(status)); 16 } else { 17 printf("unkown sig\n"); 18 } 19 } 20 21 int main(void) 22 { 23 int status;//存储子进程终止返回的状态 24 pid_t pid; 25 26 /* 正常终止 */ 27 if((pid = fork()) < 0) { 28 perror("fork error"); 29 exit(1); 30 } else if(pid == 0) { 31 printf("pid: %d, ppid: %d\n", getpid(), getppid()); 32 exit(3);//子进程终止运行 33 } 34 35 //父进程调用wait函数阻塞,等待子进程结束并回收 36 wait(&status); 37 out_status(status); 38 printf("==========================\n"); 39 40 /* 非正常终止 */ 41 if((pid = fork()) < 0) { 42 perror("fork error"); 43 exit(1); 44 } else if(pid == 0) { 45 printf("pid: %d, ppid: %d\n", getpid(), getppid()); 46 int i = 3; 47 int j = 0; 48 int k = i / j; 49 printf("k: %d\n", k); 50 } 51 52 wait(&status); 53 out_status(status); 54 printf("==========================\n"); 55 56 /* 暂停 */ 57 if((pid = fork()) < 0) { 58 perror("fork error"); 59 exit(1); 60 } else if(pid == 0) { 61 printf("pid: %d, ppid: %d\n", getpid(), getppid()); 62 pause();//暂停,即为阻塞,等待一个信号将它继续运行 63 /* 64 int i = 0; 65 while(++i > 0) sleep(3);*/ 66 } 67 68 do{ 69 //子进程若结束,则 pid 为子进程编号 70 //WNOHANG 非阻塞,waitpid 即子进程还没结束,waitpid 直接返回 71 pid = waitpid(pid, &status, WNOHANG | WUNTRACED); 72 if(pid == 0) sleep(1);//pid = 0, 则子进程没有结束,则父进程睡眠 1 s 73 }while(pid == 0); 74 out_status(status); 75 76 return 0; 77 }
编译测试与 process_wait.c 一样
再次发出 kill -19 pid:
标签:技术 返回 col sig options 阻塞 进程睡眠 printf use
原文地址:https://www.cnblogs.com/kele-dad/p/9147612.html