主进程等待子进程结束
2017-12-02 17:12
369 查看
子进程先于父进程退出时,如果父进程没有调用wait和waitpid函数,子进程就会进入僵死状态。如果父进程调用了wait或waitpid函数,就不会使子进程变为僵尸进程。这两个函数的声明如下:
(1)wait函数使父进程暂停执行,直到它的一个子进程结束为止。该函数的返回值是终止运行的子进程的PID。参数statloc所指向的变量存放子进程的退出码,即从子进程的main函数返回的值或子进程中exit函数的参数。如果statloc不是一个空指针,状态信息将被写入它指向的变量。
(2)waitpid也用来等待子进程的结束,但它用于等待某个特定进程结束。参数pid指明要等待的子进程的PID。参数statloc的含义与wait函数中的statloc相同。options参数允许用户改变waitpid的行为,若将该参数赋值为WNOHANG,则使父进程不被挂起而立即返回并执行其后的代码。
注意:(1)wait等待第一个终止的子进程,而waitpid则可以指定等待特定的子进程。
(2)waitpid提供了一个wait的非阻塞版本。有时希望取得一个子进程的状态,但不想使父进程阻塞,waitpid提供了一个这样的选项:WNOHANG,它可以使调用者不阻塞。
程序运行结果如下:
父进程调用wait后被挂起等待(此时打开另外一个终端,输入命令ps aux可以看到父进程的状态为S),直到子进程结束为止。子进程正常结束后,wait函数返回刚刚结束运行的子进程的pid,宏WEXITSTATUS获取子进程的退出码(本例中设置为37)。
#include <sys/types.h> #include <sys/wait.h> pid_t wait(int *statloc); pid_t waitpid(pid_t pid, int *statloc, int options);
(1)wait函数使父进程暂停执行,直到它的一个子进程结束为止。该函数的返回值是终止运行的子进程的PID。参数statloc所指向的变量存放子进程的退出码,即从子进程的main函数返回的值或子进程中exit函数的参数。如果statloc不是一个空指针,状态信息将被写入它指向的变量。
(2)waitpid也用来等待子进程的结束,但它用于等待某个特定进程结束。参数pid指明要等待的子进程的PID。参数statloc的含义与wait函数中的statloc相同。options参数允许用户改变waitpid的行为,若将该参数赋值为WNOHANG,则使父进程不被挂起而立即返回并执行其后的代码。
注意:(1)wait等待第一个终止的子进程,而waitpid则可以指定等待特定的子进程。
(2)waitpid提供了一个wait的非阻塞版本。有时希望取得一个子进程的状态,但不想使父进程阻塞,waitpid提供了一个这样的选项:WNOHANG,它可以使调用者不阻塞。
#include <stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> int main() { pid_t pid; char *msg; int k; int exit_code; printf("Study how to get exit code\n"); pid = fork(); switch(pid) { case 0: //子进程 msg = "Child process is running"; k = 5; exit_code = 37; break; case -1: perror("Process creation failed\n"); exit(1); default: //父进程 exit_code = 0; break; } // 父进程等待子进程结束 if(pid != 0) { int stat_val; pid_t child_pid; child_pid = wait(&stat_val); printf("Child process has exited, pid = %d\n",child_pid); if(WIFEXITED(stat_val)) printf("Child exited with code %d\n",WEXITSTATUS(stat_val)); else printf("Child exited abnormally\n"); } // 子进程暂停5秒,在这个过程中可以运行命令ps aux查看父进程状态 else { while(k-->0) { puts(msg); sleep(1); } } // 父子进程都会执行以下这段代码。父进程的exit_code是0,而子进程的exit_code是37 exit(exit_code); }
程序运行结果如下:
父进程调用wait后被挂起等待(此时打开另外一个终端,输入命令ps aux可以看到父进程的状态为S),直到子进程结束为止。子进程正常结束后,wait函数返回刚刚结束运行的子进程的pid,宏WEXITSTATUS获取子进程的退出码(本例中设置为37)。
相关文章推荐
- 等待进程结束
- Linux下利用fork()创建子进程并使父进程等待子进程结束
- Linux父进程等待子进程结束
- C程序完成:父进程创建一个子进程,父进程对子进程设置一个报警信号,然后父进程等待子进程的结束,如果此时报警信号先到,就终止子进程。
- 1.写多进程,一个父进程,两个子进程,一个运行ls –l, 另一个暂停5s,父进程先阻塞等待第一个子进程的结束,然后用非阻塞等另一个进程退出,收集到第二个子进程结束的信息,父进程就返回。
- system函数不用等待子进程结束
- Linux--等待进程结束wait()和waitpid()
- 我在delphi中用shellExecute启动了一个程序(ftp);然后想做一个等待,只到ftp进程结束,再继续下面的操作,请问如何监控这个进程是否已结束?
- 等待进程结束
- shell命令管道未读完阻塞了子进程,与等待其结束的父进程死"锁"。
- Delphi写的等待进程运行结束函数
- Linux系统编程——进程的控制:结束进程、等待进程结束
- delphi 如何等待进程树的结束
- 【vs2015】C++ 程序运行并等待进程结束
- Linux系统编程——进程的控制:结束进程、等待进程结束
- c# 使用Process调用外部程序时等待该进程结束后再执行住进程
- Delphi写的等待进程运行结束函数
- Linux 等待进程结束 wait() 和 waitpid()
- 演示等待通过CreateProcess创建的进程结束
- Linux系统编程——进程的控制:结束进程、等待进程结束