我得到了这个简单的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/

10-09 08:42
查看更多