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

标签 c shell unix

我有一个 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 会很有帮助地从管道中读取所有内容并打印出来。

关于c - 如何将 SIGALRM 传递给在微秒内完成执行的程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40009985/

相关文章:

file - 在第 N 次出现分隔符时拆分文件

c - 使用WELL512获取一定范围内的随机实数

json - 如何从命令行修改 JSON 文件中的键值

c - 有没有办法在 C 中将数字范围定义为常量?

Bash IFS 忽略行尾的分隔符

linux - 用于复制目录中的所有文件并附加 filenameCopy 的 Bash 脚本

linux - 了解 BASH 中的排序命令

date - date +%s 结果是本地时区还是UTC?

c - LED 保持亮起。不会打开和关闭

c - 如何在 'while' 循环中重新输入整数值?