我正在開發C中的應用程序。 父進程和子進程通過管道進行通信。 在寫入管道之前,父進程執行另一個語句。在示例代碼中,我使用睡眠(10)來延遲。 在子進程中,它應該從管道讀取數據。 但是在子進程中管道的讀取端沒有讀取數據。如何等待數據寫入管道的另一端
int main()
{
int pid;
FILE *fp;
fp = fopen("test.txt","w");
char *buff;
int fd[2];
int count = 0 ;
pipe(fd);
pid = fork();
if(pid == 0)
{
close(fd[1]);
ioctl(fd[0], FIONREAD, &count);
fprintf(fp,"Value of count: %d ",count);
buff = malloc(count);
fprintf(fp,"\n TIME before read: %s",__TIME__);
read(fd[0], buff, count);
fprintf(fp,"\nbuffer: %s\n TIME after read %s", buff, __TIME__);
}
else{
close(fd[0]);
sleep(10); //delay caused by application specific code replaced with sleep
write(fd[1],"THIS is it",10);
}
fclose(fp);
return 0;
}
如何讓子進程等到數據寫在另一端?
這就是正確的,但是父母每次寫可變大小數據,這就是爲什麼我用ioctl來獲取管道上的數據的大小。我可以阻止ioctl直到在管道上收到數據爲止嗎? – 2013-03-04 08:49:08
@Ajay不,沒有辦法阻止'ioctl()'。 – 2013-03-04 08:51:25
@Ajay老實說,如果大小是重要的我會強烈建議*反對*利用'ioctl()'這個信息。從字面上看,從調用它的時間開始,直到您跟進一個read-op,由於從管道的另一端寫入了更多的數據,大小可能已經無效。如果你想讀取父節點將要發送的num-bytes,那麼把你的*協議的那部分(例如,前四個字節是一個32位網絡字節順序的消息長度)。 – WhozCraig 2013-03-04 08:55:24