我在子进程中重定向 stdin 和 stdout 的文件描述符,如下所示。现在,我希望子进程等到数据在输入描述符中可用。目前,如果数据在输入描述符中不可用,则子进程采用一些随机值(我猜是EOF)并终止。
fd0=open("in1.dat", O_RDWR|O_CREAT);
fd1=open("out1.dat", O_RDWR|O_CREAT);
if(pid==0)
{
dup2(fd0, 0); // redirect input to the file
dup2(fd1, 1); // redirect output to the file
execlp("./flip","flip","new","4",NULL);
}
从文件描述符读取将阻塞,直到数据可用(除非您安排读取为非阻塞)。 在您的情况下,如果文件为空,则读取确实会返回 0 以指示文件结束,并且不会将任何内容写入缓冲区(因此您在那里看到的随机值是调用读取之前的任何值)。 如果要将输入文件视为管道(例如,希望子文件等到其他人将数据写入文件),那么要使输入文件成为fifo而不是常规文件。 (例如,使用mknod而不是open。