📅  最后修改于: 2023-12-03 15:10:14.930000             🧑  作者: Mango
在 UNIX 操作系统中,在调用 wait() 函数时,如果一个子进程已经被停止了,它将保留状态并等待父进程获取相应的状态信息。如果子进程已经收到 SIGKILL 信号,则在调用 wait() 函数时,父进程会得到的状态信息是什么?
当子进程接收到 SIGKILL 信号时,它将立即停止,并且操作系统将清理子进程的所有资源。在这种情况下,父进程将得到一个信号,通知它的子进程已经意外终止。在调用 wait() 函数时,父进程将得到一个特殊的状态信息:SIGKILL 信号所致。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
pid_t child_pid = fork();
int status;
if (child_pid == -1) {
printf("Fork failed.\n");
exit(1);
} else if (child_pid == 0) {
// 子进程
printf("Child process.\n");
exit(0);
} else {
// 父进程
printf("Parent process.\n");
wait(&status);
if (WIFEXITED(status)) {
printf("Child process terminated normally with status %d.\n", WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
printf("Child process terminated by signal with code %d.\n", WTERMSIG(status));
}
}
return 0;
}
上述代码实现了一个简单的程序,其中包括了父进程和子进程。在子进程中,它仅仅是输出了一些信息之后便终止了。而在父进程中,它通过调用 wait() 函数来等待子进程的结束,并且获取相应的状态信息。如果子进程是以正常方式结束的,那么它将会收到一个 WIFEXITED 状态信息。但是在本题中,由于子进程是被 SIGKILL 信号所终止,因此父进程将会得到一个 WIFSIGNALED 状态信息。而且,在 WIFSIGNALED 状态信息中,将会有一个信号的代码字符串,可用于解释此类终止情形的内容。