无法覆盖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)