C++ 在子进程中多次调用kill()后,VM将重新启动。 #包括 #包括 #包括 #包括 #包括 #包括 #包括 使用名称空间std; 无效信号器(内部信号){ 不能确定是哪个虚拟机?如果是这样的话,那可能是你的虚拟机中的一个错误。可能它会使内核崩溃。我使用的是
在子进程中多次调用kill()后,VM将重新启动。C++ 在子进程中多次调用kill()后,VM将重新启动。 #包括 #包括 #包括 #包括 #包括 #包括 #包括 使用名称空间std; 无效信号器(内部信号){ 不能确定是哪个虚拟机?如果是这样的话,那可能是你的虚拟机中的一个错误。可能它会使内核崩溃。我使用的是,c++,linux,signals,C++,Linux,Signals,在子进程中多次调用kill()后,VM将重新启动。 #包括 #包括 #包括 #包括 #包括 #包括 #包括 使用名称空间std; 无效信号器(内部信号){ 不能确定是哪个虚拟机?如果是这样的话,那可能是你的虚拟机中的一个错误。可能它会使内核崩溃。我使用的是VirtualBox。孩子杀死家长也很奇怪。通常情况下,如果有必要这样做的话,家长要负责杀死自己。我打算让孩子向家长发送三次信号。如果你杀死了家长e parent,getppid()将在下一次调用中返回其他内容。父级的父级(祖父母)或什么都不返
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
无效信号器(内部信号){
不能确定是哪个虚拟机?如果是这样的话,那可能是你的虚拟机中的一个错误。可能它会使内核崩溃。我使用的是VirtualBox。孩子杀死家长也很奇怪。通常情况下,如果有必要这样做的话,家长要负责杀死自己。我打算让孩子向家长发送三次信号。如果你杀死了家长e parent,getppid()
将在下一次调用中返回其他内容。父级的父级(祖父母)或什么都不返回?然后第二次终止触发重新启动,可能是因为它终止了内核中的某些重要内容。
#include <signal.h>
#include <iostream>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;
void sigHandler(int sigNum){
cout << "\nSignal has been sent." << endl;
}
int main(){
pid_t PID = fork();
if(PID == -1){
perror("fork");
exit(EXIT_FAILURE);
}
if(PID == 0){
cout << "\nChild will now send a signal to the parent process." << endl;
kill(getppid(), SIGINT);
cout << "\nChild will now send a 2nd signal." << endl;
kill(getppid(), SIGINT);
cout << "\nChild will now send a 3rd signal." << endl;
kill(getppid(), SIGINT);
}else{
struct sigaction action;
action.sa_handler = sigHandler;
sigemptyset(&action.sa_mask);
int checkErr = sigaction(SIGINT, &action, NULL);
if(checkErr == -1){
perror("sigaction");
exit(EXIT_FAILURE);
}
wait(NULL);
cout << "\nParent process is now finishing." << endl;
}
}