创建write()阻塞的场景

ato*_*tom 2 c linux blocking

我有这个简单的C程序:

#include <stdio.h>

int main (int argc, char *argv[])
{
  printf ("Hello, world\n");

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我strace编译的程序printf()变为write():

$ strace ./hw > x
execve("./hw", ["./hw"], [/* 19 vars */]) = 0
...
write(1, "Hello, world\n", 13)          = 13
...
Run Code Online (Sandbox Code Playgroud)

我的问题如下:我希望操作系统在执行write()调用后阻止程序执行.作为一个简单的非root用户,是否有可能创建这样的场景?请注意,我无法更改程序代码.

我的直觉告诉我应该,但我无法找到解决方案.想象一下write()会写入一个文件描述符,该文件描述符是一个无缓冲的字符设备.这样的设备,不会强制write()阻塞吗?

ric*_*ici 6

write系统调用将数据复制到与文件描述符相关联的内核缓冲区.只要可以缓冲,呼叫就不会阻塞.但是如果你将足够的数据写入慢速输出设备,那么最终write会阻塞.

要写入几个字节来阻止它是一项工作.这是一种方法:

首先,创建一个命名管道:

mkfifo /tmp/the_fifo
Run Code Online (Sandbox Code Playgroud)

任何打开 /tmp/the_fifo写入的尝试都会阻止,直到某个进程打开fifo进行读取.您可以打开fifo进行阅读,而无需阅读以下内容:

sleep 1000 < /tmp/the_fifo &
Run Code Online (Sandbox Code Playgroud)

现在你可以填充fifo缓冲区:

yes > /tmp/the_fifo &
Run Code Online (Sandbox Code Playgroud)

此时,程序应该在尝试写入时阻止/tmp/fifo.

完成后,不要忘记终止后台进程并删除命名管道.