无法覆盖SIGINT(c+;+;) 我是C++初学者。在我们的练习中,我们实现了一个shell,它使用fork()创建子进程来处理命令。 我试图重写SIGINT(strg+c)以杀死所有正在运行的子进程,并仅在没有子进程运行时杀死父进程。但似乎我根本无法覆盖strg+c。它将始终停止整个程序
主要问题:无法覆盖SIGINT(c+;+;) 我是C++初学者。在我们的练习中,我们实现了一个shell,它使用fork()创建子进程来处理命令。 我试图重写SIGINT(strg+c)以杀死所有正在运行的子进程,并仅在没有子进程运行时杀死父进程。但似乎我根本无法覆盖strg+c。它将始终停止整个程序,c++,process,C++,Process,主要问题: list<pid_t> PIDs; int main() { pid_t p; pid_t tc; signal(SIGINT, signal_handler); atexit(killChildren); for (;;) { struct command cmd = read_command_line(); cout << "command: " <<
list<pid_t> PIDs;
int main() {
pid_t p;
pid_t tc;
signal(SIGINT, signal_handler);
atexit(killChildren);
for (;;) {
struct command cmd = read_command_line();
cout << "command: " << cmd.argv[0]
<< ", background: " << (cmd.background ? "ja" : "nein") << endl;
p = fork();
if (p == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (p == 0) {
execv(run(cmd).c_str(), cmd.argv);
} else {
PIDs.push_back(p);
if (cmd.background != 1) {
tc = wait(0);
PIDs.remove(p);
} else {
signal(SIGCHLD, signal_handler);
}
}
}
return 0;
}
杀害儿童:
void killChildren (void) {
list<pid_t>::iterator it;
for (it = PIDs.begin(); it != PIDs.end(); it++) {
kill((*it), SIGTERM);
PIDs.remove((*it));
}
}
正如你所看到的,printf被调用,所以我真的不明白为什么它会在调用之后停止整个程序。请帮忙,谢谢你的阅读 杀戮儿童是什么样的呢?我读了,我读了关于信号(信号,信号);有些人在这里尝试了它,但没有什么不同。你不应该在迭代时从列表中删除PID,另请参见哦,伙计,非常感谢Olaf Dietsche,这就是整个问题:x
void killChildren (void) {
list<pid_t>::iterator it;
for (it = PIDs.begin(); it != PIDs.end(); it++) {
kill((*it), SIGTERM);
PIDs.remove((*it));
}
}
ti2sh$ ping google.de &
command: ping, background: ja
PING google.de (173.194.35.159) 56(84) bytes of data.
64 bytes from google.de (173.194.35.159): icmp_req=1 ttl=53 time=30.2 ms
^C
--- google.de ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
Caught signal 2
rtt min/avg/max/mdev = 30.286/30.286/30.286/0.000 ms
Speicherzugriffsfehler (Speicherabzug geschrieben)