我有一个C程序,如果n作为参数传递,它会计算前n个素数。
$ ./prime 5
2
3
5
7
11
如果我可以将SIGALRM
提供给程序进程,程序的逻辑允许我进入所需的功能。
所以基本上我必须输入
kill -14 <PID of prime>
在另一个终端当&#39; prime&#39;刚开始执行,在进入循环之前找到素数。还应注意,每次执行程序时PID都会改变。
如何连接所有这些操作并在单行命令中执行此操作?
答案 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
第一个命令构造一个管道,它在写入端执行以下操作:
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
。