SIGTTIN问题

时间:2011-08-11 01:35:51

标签: c

我编写了一个示例程序来模拟SIGTTIN。它看起来如下:

// Some include files

void sigfn(int num)
{
   printf("\n SIGTTIN CAUGHT \n");
}  

int main()
{
    signal(SIGTTIN , sigfn);
    read(0, .., ..);
    write(1, .., ..);

    return 0;
}

但是当我在前台运行它时,我得到一个输出,它在无限循环中打印以下内容:

SIGTTIN CAUGHT
SIGTTIN CAUGHT
SIGTTIN CAUGHT
SIGTTIN CAUGHT
SIGTTIN CAUGHT
SIGTTIN CAUGHT
SIGTTIN CAUGHT
.
.
.
.

我理解这是因为read是一个阻塞系统调用,但是如何阻止它呢? 我现在正在关闭终端。请帮助我如何阻止它以及为什么这样做。

1 个答案:

答案 0 :(得分:1)

#include <stdio.h>
#include <signal.h>

void sigfn(int num){
   printf("sigttin");                                                           
}

int main(){
   char c;

   signal(SIGTTIN,sigfn);

   read(0,&c,1);

   printf("%c\n",c);
   return 0;

}

在前台运行时,我没有得到无限循环。它会what it should并阻塞,直到有东西要读。

$ ./sim_ttin

要阻止它(我猜你的意思是kill),只需打开另一个控制台,查找该进程并将其终止。

这就是我所做的: 在一个控制台中:

  

$。/ sim_ttin&amp;   nsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigtt insigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttin

然后我打开另一个控制台并输入:

$ps aux | grep sim_ttin
user     4350  6.0  0.0   1620   340 pts/0    S    22:58   0:00 ./sim_ttin

4350是pid。只是杀了它

$ kill -9 4350

让我们检查第一个控制台:

  

insigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttinsigttins

     

[1] +杀死./sim_ttin