在下面,subprocess创build对象。 它使用信号在一段时间后自杀:
#include <unistd.h> #include <signal.h> #include <sys/types.h> #include <sys/wait.h> #include <stdlib.h> #include <iostream> using namespace std; class Wut{ public: Wut(){cout<<"obj being created" << endl;} ~Wut(){cout<<"obj being destroyeed" << endl;} }; void alarmHandler(){ cout << "Alarm! Forcing child to kill itself" << endl; kill(getpid(), SIGKILL); } int main(int argc, char* argv[]){ int status; pid_t pid; if((pid = fork()) == 0){ Wut hi; signal(SIGALRM, (sighandler_t)alarmHandler); alarm(1); alarm(7); sleep(10); cout << "this will not get printed" << endl; } else { wait(&status); cout << "Parent dies" << endl; } sleep(10); return 0; }
但是我不确定它创build的对象是否被正确的销毁,因为它从不调用析构函数。
KILL信号实际上并不发送给进程; 这是操作系统强行停止程序执行的信号。 这意味着析构函数将不会被调用。
使用像SIGTERM
这样的信号来查看预期的行为:
kill(getpid(), SIGTERM);
Unix进程无法以任何方式处理SIGKILL
。 你的过程马上死亡,像一扇门。 如果你想要一个优雅的退出,看看SIGTERM
。 然后你可以注册一个处理程序来做任何你需要的清理。
您可以使用处理程序将程序置于正常退出的状态(例如,通过设置标志等),允许析构函数运行。
SIGKILL
(在大多数情况下)与kill -9
相同,所以分配给该进程的所有内存都被操作系统回收。