为什么进程总是不停的收到SIGTTOU信号,请高手指点

awangyong12345 2009-12-29 10:49:02
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<signal.h>
#include<errno.h>
static void sig_ttou(int signo)
{
printf("SIGTTOU receive");
}
int main(void)
{
signal(SIGTTOU,sig_ttou);
printf("hello");
return 0;

}

这是程序的源代码,根据UNIX环境高级编程上所说,用stty tostop关闭后台输出后,在后台进程试图写控制终端的时候,产生SIGTTOU信号。问题(1):我用./sigttou & 讲这个程序在后台执行以后,它总是不停的收到SIGTTOU信号呢?总不是停的打印SIGTTOU receive,好像一个死循环一样 无休止的打印SIGTTOU receive 请各位大哥帮小弟解惑。
问题(2):我将signal的第二个参数设置成SIG_IGN,忽略SIGTTOU信号,同样也是用 stty tostop 关闭后台输出,将该进程在后台执行,为什么会输出hello 我不是已经关闭了后台输出了吗?为什么这个进程还能在控制终端输出呢,请高手帮忙解决,跪谢了
...全文
500 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
deep_pro 2009-12-30
  • 打赏
  • 举报
回复
lz不好意思 突然意识到刚才的回答第一个问题错误
首先是printf("hello"); 就触发SIGTTOU信号,SIGTTOU处理函数printf("SIGTTOU receive"); 继续触发SIGTTOU信号,形成一个死循环。虽然是行缓冲,也被撑爆了,一直输出printf("SIGTTOU receive");
deep_pro 2009-12-30
  • 打赏
  • 举报
回复
我用./sigttou & 讲这个程序在后台执行以后,它总是不停的收到SIGTTOU信号呢?总不是停的打印SIGTTOU receive,
-------------------------
这个因为进程执行到printf("hello"); 就触发SIGTTOU信号,处理完SIGTTOU信号后,又回到了printf("hello");
继续触发。可以使用sigsetjmp/siglongjmp 跳出



问题(2):我将signal的第二个参数设置成SIG_IGN,忽略SIGTTOU信号,同样也是用 stty tostop 关闭后台输出,将该进程在后台执行,为什么会输出hello 我不是已经关闭了后台输出了吗?
-----------------
不知道为什么,虽然是后台进程,也只有
close(0);
close(1);
close(2);
之后才能没有输出

另外,lz的代码printf("hello");之有进程结束才能输出,因为stdout是行缓冲,需要printf("hello\n");
deep_pro 2009-12-30
  • 打赏
  • 举报
回复
如果SIGFPE,SIGILL或SIGSEGV信号不是由C标准定义的kill( )或raise( )函数所生成,则从信号SIGFPE,SIGILL,SIGSEGV的信号捕获函数正常返回后线程的行为是未定义的。

int c=b/a; 替换成 kill(getpid(),SIGFPE);即可

也可以使用sigsetjmp/siglongjmp 跳出
awangyong12345 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 deep_pro 的回复:]
lz不好意思 突然意识到刚才的回答第一个问题错误
首先是printf("hello"); 就触发SIGTTOU信号,SIGTTOU处理函数printf("SIGTTOU receive"); 继续触发SIGTTOU信号,形成一个死循环。虽然是行缓冲,也被撑爆了,一直输出printf("SIGTTOU receive");
[/Quote]

谢谢 这个大哥的回答 ,但是还有个小程序,和上面那个程序的情况一样,当除以0的时候,会产生SIGFPE 信号,为什么这个进程也总是受到这个信号 也不断的打印呢
#include<unistd.h>
#include<signal.h>
#include<stdlib.h>
#include<errno.h>
#include<sys/types.h>
#include<stdio.h>
static void sig_fpe(int signo)
{
printf("sig_fpe receive");
}
int main(void)
{
int a=0;
int b=1;
signal(SIGFPE,sig_fpe);
int c=b/a;
return 0;
}
请大家帮忙解惑 我会加分的~~ 谢谢各位了
平凡的思想者 2009-12-30
  • 打赏
  • 举报
回复
正解。

[Quote=引用 2 楼 deep_pro 的回复:]
lz不好意思 突然意识到刚才的回答第一个问题错误
首先是printf("hello"); 就触发SIGTTOU信号,SIGTTOU处理函数printf("SIGTTOU receive"); 继续触发SIGTTOU信号,形成一个死循环。虽然是行缓冲,也被撑爆了,一直输出printf("SIGTTOU receive");
[/Quote]
steptodream 2009-12-30
  • 打赏
  • 举报
回复
楼上是高手 这解释我都看明白了

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧