gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:27:36 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com