我有这个简单的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()阻塞吗?
该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.
完成后,不要忘记终止后台进程并删除命名管道.