我正在计算信号在C中是如何工作的.这是从旧考试中得到的一个例子:
#include<signal.h>
#include<unistd.h>
#include<stdio.h>
#include<errno.h>
//#include <sys/types.h>
void handler1(int sig) {
printf("Phantom");
exit(0);
}
int main()
{
pid_t pid1;
signal(SIGUSR1, handler1); //installing signal handler
if((pid1 = fork()) == 0) { //forking
printf("Ghost");
exit(0);
}
kill(pid1, SIGUSR1);
printf("Ninja");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,海湾合作委员会给了我两个答案Ghost Ninja:Ninja Phantom.它可以生产Ghost Phantom Ninja或由3个名字组成的任何其他组合?
我看到它可能产生3个名字的一种方法是:Fork,在Child中运行,print Ghost,exit(0)=>在Parent中,接受/处理信号,从信号处理程序打印Phantom,杀死子,打印Ninja.但我不确定我的"理论"是否成立.
还有,会kill(pid1, SIGUSR1)调用handler()吗?
谢谢 !
让我们逐行检查.设置信号处理程序,然后fork.孩子打印"Ghost"并退出.父母让孩子打印"Phantom"并退出.然后父母打印"Ninja".
所以你真的遇到了竞争条件.如果父母SIGUSR1在孩子打印"Ghost"之前触发它,那么你会得到Phantom Ninja,或者也许Ninja Phantom(确实杀死了?)
但是,如果你不能及时关闭信号,那么你会Ghost Ninja在孩子完成信号之前完成.我不认为反过来是可能的.
现在可以想象的信号可能是恰好在时间之间打printf和exit,在这种情况下Ghost将完成,然后Phantom再Ninja-或者相反再次,我想.
它对操作系统时序非常挑剔和敏感.
@Everyone - 未经测试!随意反驳我,但我会有兴趣知道为什么作为OP.
| 归档时间: |
|
| 查看次数: |
7157 次 |
| 最近记录: |