繁体   English   中英

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

[英]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

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

  • 将65536个空字节写入管道,填满它。
  • 开始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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM