当前位置: 技术问答>linux和unix
为什么进程总是不停的收到SIGTTOU信号,请高手指点
来源: 互联网 发布时间:2016-07-25
本文导语: #include #include #include #include #include static void sig_ttou(int signo) { printf("SIGTTOU receive"); } int main(void) { signal(SIGTTOU,sig_ttou); printf("hello"); return 0; } 这是程序的源代码,根据UNIX环境高级编程上所说,...
#include
#include
#include
#include
#include
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 我不是已经关闭了后台输出了吗?为什么这个进程还能在控制终端输出呢,请高手帮忙解决,跪谢了
#include
#include
#include
#include
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 我不是已经关闭了后台输出了吗?为什么这个进程还能在控制终端输出呢,请高手帮忙解决,跪谢了
|
我用./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("hellon");
-------------------------
这个因为进程执行到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("hellon");