我有一个程序从stdin读取数据,同时有时需要fork()并异步执行命令。在这个fork之后的短时间内(可能是在命令正在运行时),父进程似乎会丢失从stdin读取的数据。如果只丢失了一个字节,程序将无法恢复。
fork()的man页面说子进程继承了父进程的打开文件描述符副本,但是在fork()之后并在execvp()之前尝试关闭(STDIN_FILENO)并没有起到作用。
我的程序基本上做了这些:
fork()的man页面说子进程继承了父进程的打开文件描述符副本,但是在fork()之后并在execvp()之前尝试关闭(STDIN_FILENO)并没有起到作用。
我的程序基本上做了这些:
if (we_need_to_run_a_command_asynchronously) {
if (!fork()) {
close(STDIN_FILENO);
char *args[] = { "command", "arg", "etc", 0 };
setpriority(PRIO_PROCESS, 0, -19);
execvp("command", args);
exit(0); // Ignore errors
}
}
我该如何确保子进程无法干扰父进程的标准输入(或其他属于父进程的内容)?执行的命令通常是一个shell脚本。
我不知道我的程序出了什么问题,但只要它不运行任何命令,它就可以正常运行。仅在运行命令后有时(不总是)从标准输入读取的数据会被染污,这就是我怀疑问题与fork()之后的标准输入有关的原因。
/dev/null
以读取数据。除了command
是一个 shell 内置命令之外,你对它还了解多少呢?这个命令是你自己编写的吗?它从哪里读取数据?基本上,如果你将其标准输入流连接到/dev/null
,那么你不应该遇到问题。 - Jonathan Leffler