如何将SIGALRM传递给一个在微秒内完成执行的程序?

时间:2016-10-12 23:32:06

标签: c shell unix

我有一个C程序,如果n作为参数传递,它会计算前n个素数。

$ ./prime 5
2
3
5
7
11

如果我可以将SIGALRM提供给程序进程,程序的逻辑允许我进入所需的功能。

所以基本上我必须输入

kill -14 <PID of prime>

在另一个终端当&#39; prime&#39;刚开始执行,在进入循环之前找到素数。还应注意,每次执行程序时PID都会改变。

如何连接所有这些操作并在单行命令中执行此操作?

3 个答案:

答案 0 :(得分:1)

在写入完整管道时阻止prime

要使其工作,您需要确切知道系统上管道的容量。在大多数系统上,这是64 KB - 65536字节。一些不起眼的UNIX系统(不是Linux,而不是Mac OS X)可能具有不同的管道容量,因此如果这不起作用,您可能需要检查它。

( dd if=/dev/zero bs=65536 count=1 ; ./prime ) | ( sleep 3; cat )
sleep 1
killall -ALRM prime

第一个命令构造一个管道,它在写入端执行以下操作:

  • 将65536个空字节写入管道,填满它。
  • 开始prime

并在阅读结束时:

  • sleep 3秒钟。
  • cat从管道中读取所有内容并将其打印直至达到EOF。

prime启动时,管道中充满了64KB的空字节,而另一端的进程是sleep 3,它不是从管道中读取的。一旦它开始尝试write()它的第一行输出,它就会阻塞。当发生这种情况时,sleep 1将完成,并且警报信号将传递到prime,这会被方便地阻止。这使得它......无论它在获得SIGALRM时做什么。

sleep 3完成后,cat会帮助读取管道中的所有内容并将其打印出来。

答案 1 :(得分:0)

信号的异常目的!

我能看到的最简单的方法是在gdb中运行prime,并使用其signal函数将信号发送到您的程序。

答案 2 :(得分:-1)

确保SIGALRM在特定时间被提升的最简单方法是添加:

raise(SIGALRM);

在该计划的特定点。然后,当执行该调用时,将始终引发SIGALRM