C/C++ 中的信号行为 - Linux
Signals Behavior in C/C++ - Linux
对进程和信号完全陌生,我正在弄乱我编写的以下代码:
void childSignalHandler(int signalCode) {
if (signalCode == SIGUSR1)
cout << "Child here : Received ping, responding" << endl;
}
void parentSignalHandler(int signalCode) {
if (signalCode == SIGINT)
cout << "Parent here : Pinging Child" << endl;
else if (signalCode == SIGUSR1)
cout << "Parent here : Received response" << endl;
}
int main() {
int pid = fork();
/* Child process*/
if (pid == 0) {
if (signal(SIGUSR1, childSignalHandler) == SIG_ERR) {
perror("Child SIGUSR1");
exit(1);
}
// This did the trick!
if (signal(SIGINT,SIG_IGN) == SIG_ERR){
perror("Child SIGINT");
exit(1);
}
pause();
kill(getppid(), SIGUSR1);
} else {
if (signal(SIGINT, parentSignalHandler) == SIG_ERR) {
perror("Parent SIGINT");
exit(1);
}
if (signal(SIGUSR1, parentSignalHandler) == SIG_ERR) {
perror("Parent SIGUSR1");
exit(1);
}
raise(SIGINT); // Maybe change it to pause(); to use keyboard instead ?
kill(pid, SIGUSR1);
pause();
}
return 0;
}
上面的代码工作得很好,预期的行为是:
Parent here : Pinging Child
Child here : Received ping, responding
Parent here : Received response
然而,当我使用键盘 Ctrl + C
信号尝试相同的操作并将 raise(SIGINT);
更改为 pause();
时,输出为:
^CParent here : Pinging Child
^CParent here : Pinging Child
我认为这可行的方式是:
- 两个进程都将暂停
CTRL + C
又名 SIGINT
将被发送到将 未暂停 的父进程
parentSignalHandler()
将处理 SIGINT
并打印相应的消息
- 父进程将
SIGUSR1
发送给将取消暂停的子进程,父进程本身将再次暂停
childSignalHandler()
将处理 SIGUSR1
- 最后子进程会发送一个
SIGUSR1
给父进程,再一次被parentSignalHandler()
处理
似乎它不像我想象的那样工作,任何见解都会非常有帮助。
编辑 -- 更新代码
raise(SIGINT)
仅向调用进程发送 SIGINT
信号 - 在本例中为父进程。另一方面,当您使用 CTRL + C
发送 SIGINT
信号时,您将其发送到 所有前台进程 ,即子进程也接收到它,因此终止。所以就没有子进程去回复父进程的SIGUSR1
信号了。尝试忽略子进程中的信号。
对进程和信号完全陌生,我正在弄乱我编写的以下代码:
void childSignalHandler(int signalCode) {
if (signalCode == SIGUSR1)
cout << "Child here : Received ping, responding" << endl;
}
void parentSignalHandler(int signalCode) {
if (signalCode == SIGINT)
cout << "Parent here : Pinging Child" << endl;
else if (signalCode == SIGUSR1)
cout << "Parent here : Received response" << endl;
}
int main() {
int pid = fork();
/* Child process*/
if (pid == 0) {
if (signal(SIGUSR1, childSignalHandler) == SIG_ERR) {
perror("Child SIGUSR1");
exit(1);
}
// This did the trick!
if (signal(SIGINT,SIG_IGN) == SIG_ERR){
perror("Child SIGINT");
exit(1);
}
pause();
kill(getppid(), SIGUSR1);
} else {
if (signal(SIGINT, parentSignalHandler) == SIG_ERR) {
perror("Parent SIGINT");
exit(1);
}
if (signal(SIGUSR1, parentSignalHandler) == SIG_ERR) {
perror("Parent SIGUSR1");
exit(1);
}
raise(SIGINT); // Maybe change it to pause(); to use keyboard instead ?
kill(pid, SIGUSR1);
pause();
}
return 0;
}
上面的代码工作得很好,预期的行为是:
Parent here : Pinging Child
Child here : Received ping, responding
Parent here : Received response
然而,当我使用键盘 Ctrl + C
信号尝试相同的操作并将 raise(SIGINT);
更改为 pause();
时,输出为:
^CParent here : Pinging Child
^CParent here : Pinging Child
我认为这可行的方式是:
- 两个进程都将暂停
CTRL + C
又名SIGINT
将被发送到将 未暂停 的父进程
parentSignalHandler()
将处理SIGINT
并打印相应的消息- 父进程将
SIGUSR1
发送给将取消暂停的子进程,父进程本身将再次暂停 childSignalHandler()
将处理SIGUSR1
- 最后子进程会发送一个
SIGUSR1
给父进程,再一次被parentSignalHandler()
处理
似乎它不像我想象的那样工作,任何见解都会非常有帮助。
编辑 -- 更新代码
raise(SIGINT)
仅向调用进程发送 SIGINT
信号 - 在本例中为父进程。另一方面,当您使用 CTRL + C
发送 SIGINT
信号时,您将其发送到 所有前台进程 ,即子进程也接收到它,因此终止。所以就没有子进程去回复父进程的SIGUSR1
信号了。尝试忽略子进程中的信号。