[英]How to pass SIGALRM to a program which completes execution within microseconds?
我有一个C程序,如果n作为参数传递,则计算前n个素数。
$ ./prime 5
2
3
5
7
11
如果我可以将SIGALRM
给程序的进程,程序的逻辑允许我进入所需的功能。
所以基本上我必须进入
kill -14 <PID of prime>
当'prime'刚刚开始执行时,在另一个终端中,在进入循环之前找到素数。 还应注意,每次执行程序时PID都会改变。
如何连接所有这些操作并在单行命令中执行此操作?
请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
有助于从管道中读取所有内容并打印出来。
相当不寻常的信号目的!
我能看到的最简单的方法是在gdb中运行prime
,并使用其signal
函数将信号发送到您的程序。
可能是确保SIGALRM
在特定时间被提升的最简单方法是添加:
raise(SIGALRM);
在计划的特定点。 然后在执行该调用时将始终引发SIGALRM
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.