在Linux中,wait()
和waitpid()
函數用于等待子進程的終止。
wait()
函數的原型如下:
pid_t wait(int *status);
其中status
是一個指向整型變量的指針,用于存儲子進程的退出狀態。該函數會阻塞調用進程,直到一個子進程終止。如果子進程已經終止,那么它的退出狀態會被立即返回。如果調用進程沒有子進程或者子進程已經被其他進程等待,那么wait()
函數會立即出錯返回-1。
waitpid()
函數的原型如下:
pid_t waitpid(pid_t pid, int *status, int options);
其中pid
是要等待的子進程的進程ID。使用-1
表示等待任意子進程。status
參數用于存儲子進程的退出狀態。options
參數用于指定其他選項,如WNOHANG
表示非阻塞等待。
waitpid()
函數會阻塞調用進程,直到指定的子進程終止。如果指定的子進程已經終止,那么它的退出狀態會被立即返回。如果調用進程沒有指定的子進程或者指定的子進程已經被其他進程等待,那么waitpid()
函數會立即出錯返回-1。
以下是一個使用wait()
函數的示例:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t pid;
int status;
pid = fork();
if (pid == 0) {
// 子進程
printf("子進程開始運行\n");
sleep(3);
printf("子進程結束\n");
exit(0);
} else if (pid > 0) {
// 父進程
printf("父進程等待子進程終止\n");
wait(&status);
printf("子進程終止\n");
} else {
// fork失敗
printf("fork失敗\n");
return 1;
}
return 0;
}
以下是一個使用waitpid()
函數的示例:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t pid;
int status;
pid = fork();
if (pid == 0) {
// 子進程
printf("子進程開始運行\n");
sleep(3);
printf("子進程結束\n");
exit(0);
} else if (pid > 0) {
// 父進程
printf("父進程等待子進程終止\n");
waitpid(pid, &status, 0);
printf("子進程終止\n");
} else {
// fork失敗
printf("fork失敗\n");
return 1;
}
return 0;
}
以上示例中,父進程會等待子進程終止,然后打印相應的信息。