我有一个 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
第一个命令构造了一个管道,它在写入端执行以下操作:
- 向管道写入 65536 个空字节,将其填满。
- 启动
prime
。
在阅读端:
sleep
3 秒。
- 让
cat
从管道中读取所有内容并打印直到到达 EOF。
当 prime
启动时,管道充满了 64KB 的空字节,另一端的进程是 sleep 3
,它不是从管道读取.一旦它开始尝试 write()
它的第一行输出,它就会阻塞。发生这种情况时,sleep 1
将结束,并向 prime
发送警报信号,方便地阻止它。这使得它可以做......当它收到 SIGALRM 时它会做任何事情。
sleep 3
完成后,cat
会很有帮助地从管道中读取所有内容并打印出来。
我是一名优秀的程序员,十分优秀!