我得到了这个简单的C程序:
#include <stdio.h>
int main (int argc, char *argv[])
{
printf ("Hello, world\n");
return 0;
}
如果我跟踪已编译的程序,则printf()变为write():
$ strace ./hw > x
execve("./hw", ["./hw"], [/* 19 vars */]) = 0
...
write(1, "Hello, world\n", 13) = 13
...
我的问题如下:我希望操作系统一旦执行write()调用就阻止程序执行。作为简单的非root用户,是否可以创建这样的方案?请注意,我无法更改程序代码。
我的直觉告诉我应该这样做,但是我找不到解决方案。想象一下write()将写入到与无缓冲字符设备相对应的文件描述符中。这样的设备,会不会迫使write()阻塞?
最佳答案
write
系统调用将数据复制到与文件描述符关联的内核缓冲区中。只要可以缓冲,调用就不会阻塞。但是,如果将足够的数据写入速度较慢的输出设备,则最终write
将阻塞。
要写入几个字节进行阻止需要一些工作。这是一种实现方法:
首先,创建一个命名管道:
mkfifo /tmp/the_fifo
任何打开
/tmp/the_fifo
进行写入的尝试都将被阻止,直到某些进程打开fifo进行读取为止。您可以打开fifo进行阅读,而无需阅读以下内容:sleep 1000 < /tmp/the_fifo &
现在您可以填充fifo缓冲区:
yes > /tmp/the_fifo &
此时,您的程序在尝试写入
/tmp/fifo
时应阻塞。完成后,别忘了杀死后台进程并删除命名管道。
关于c - 创建一个场景,其中write()被阻止,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29262119/