C 正在等待来自文件描述符的输入
我在子进程中重定向stdin和stdout的文件描述符,如下所示。 现在,我希望子进程等待输入描述符上的数据可用。当前,如果数据在输入描述符处不可用,那么子进程将获取一些随机值(我猜是EOF)并终止C 正在等待来自文件描述符的输入,c,file-descriptor,child-process,C,File Descriptor,Child Process,我在子进程中重定向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(f
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);
}
从文件描述符读取数据将一直阻塞,直到数据可用为止(除非您将读取安排为非阻塞)。在您的例子中,如果文件是空的,那么read确实会返回0以表示文件结束,并且不会将任何内容写入缓冲区(因此您看到的随机值是在调用read之前存在的值)。如果希望将输入文件视为管道(例如,希望孩子等待其他人将数据写入文件),则希望将输入文件设置为fifo,而不是常规文件。(例如,使用mknod而不是open。)从文件描述符读取将阻塞,直到数据可用为止(除非您将读取安排为非阻塞)。在您的例子中,如果文件是空的,那么read确实会返回0以表示文件结束,并且不会将任何内容写入缓冲区(因此您看到的随机值是在调用read之前存在的值)。如果希望将输入文件视为管道(例如,希望孩子等待其他人将数据写入文件),则希望将输入文件设置为fifo,而不是常规文件。(例如,使用mknod而不是open。)我几乎不会调用EOF“一些随机值”,尤其是当您将stdin显式设置为空文件时。我几乎不会调用EOF“一些随机值”,尤其是当您将stdin显式设置为空文件时。