- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
大家好,在使用 fork 和 signal 做一些实验时,我遇到了一个显示非常有趣的行为的程序,但经过几个小时的努力,我无法弄清楚发生了什么。
我想做的是在主体内创建一个子进程,然后打印“hello world”,然后调用退出。在此之后,完全可以理解它的信号处理程序将被调用,并且被 wait 系统调用阻塞的父进程也将被调用。现在我正在信号处理程序中创建另一个进程,但从那里开始,输出变为无限。
输出是这样的: Hello World 来到 Linux 来到 UNIX 来到 Linux 来到 UNIX 来到 Linux 来到 UNIX ...
还有为什么一而再再而三的来到Linux打印。
另外请告诉我什么时候 fork 被调用,我知道重复的地址空间是由父进程组成的,但是信号处理程序呢?他们也会重复吗?在我的例子中,当 child 调用退出时。然后被调用的信号处理程序是子级或父级的。
请帮忙。谢谢。
void sig_handler(int signo)
{
if(fork() == 0){
}
else{
int pid = 0;
wait(&pid);
printf("Come to unix");
fflush(stdout);
}
}
int main()
{
if (signal(SIGCHLD, sig_handler) == SIG_ERR){
}
int child_pid;
int i;
child_pid = fork();
switch (child_pid) {
case -1:
perror("fork");
exit(1);
case 0:
printf("hello world\n");fflush(stdout);
exit(0);
default:
wait(&i);
printf("Come to linux");
exit(0);
//break;
}
return 0;
}
最佳答案
不是很明显会进入死循环吗?您已经创建了一个 SIGCHLD 处理程序,然后在该处理程序中再次 fork 并等待子进程退出。基本上,当该处理程序中的子项退出时,父项再次进入处理程序。下面的代码应该避免它。在信号处理程序的开始,通过将其设置为默认值来避免信号。
void sig_handler(int signo) {
signal (SIGCHLD, SIG_IGN);
if(fork() == 0){
}
else{
int pid = 0;
wait(&pid);
printf("Come to unix");
fflush(stdout);
}
}
此外,您只能在信号处理程序中调用异步信号安全例程以避免未定义的行为。我不确定 printf 和 fflush 是否同步安全。即使进行上述更改避免了循环,程序仍可能具有未定义的行为。我猜 fork 是异步安全的
请参阅以下可能有帮助的讨论: http://sourceware.org/bugzilla/show_bug.cgi?id=4737
关于linux - 使用信号捕获 fork 时程序变得无限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15586703/
我在 android 代码中使用 asmack XMPP。我可以正常登录 XMPP 服务器,但是当我尝试创建新用户时出现问题。我想要实现的是: 以管理员身份登录。 创建一个新用户。 从管理员注销。 以
这是我的标记页面,其中有一个按钮可以从数据库中搜索数据并显示在网格中 这是我背后的代码 if (!IsPostBack) { LblInfo.Text = "Page Load
当我多次将相同的 float 值插入到我的集合中时,本应花费恒定时间的 x in s 检查变得非常慢。为什么? 时序x in s的输出: 0.06 microseconds 0.09 mi
我有一个小型聊天客户端,可以将所有历史记录存储在 sqlite 数据库中。当用户单击我的应用程序中的 history 选项卡时,我的应用程序会获取所有相关历史记录并将其显示在 QWebView 中。我
我是一名优秀的程序员,十分优秀!