【发布时间】:2012-12-08 09:54:44
【问题描述】:
我有这个代码: 当第一个孩子向第二个孩子发送数据时,程序卡住了, 第二个孩子做 fscanf 然后卡住了,因为他看不懂我找不到原因。 请帮助我了解如何确保 fflush 将传输数据。
int main()
{
pid_t childPid ; //Child's and father process id.
int i ; //An index to create children in loop.
unsigned int st_search_prime = 0 ;
if((mkfifo(FIRST_FIFO, S_IFIFO | 0644) == FAIL && errno != EEXIST) ||
(mkfifo(SECOND_FIFO, S_IFIFO | 0644) == FAIL && errno != EEXIST))
{
perror("Cannot create fifo file") ;
exit(EXIT_FAILURE) ;
}
//create the children
for(i = 0 ; i < NUM_OF_CHILDS ; i++)
{
childPid = fork() ;
if(childPid < 0) //Fork failed.
{
perror("Cannot fork()") ;
exit(EXIT_FAILURE) ;
}
else if(childPid == CHILD) //child process
{
if(i == FIRST_SON) //the 1st child process
doChild1(st_search_prime) ;
else //the 2nd child process.
doChild2(st_search_prime) ;
}
}
//wait for the children to exit.
for(i = 0 ; i < NUM_OF_CHILDS ; i++)
wait(&childPid) ;
return(EXIT_SUCCESS) ;
}
void doChild1(unsigned int st_search_prime)
{
int counter = 0 ; //Counter for N successfully raffle .
FILE* fdw1 ;
FILE* fdr2 ;
if((!(fdw1 = fopen(FIRST_FIFO, "w"))))
{
perror("Cannot open fifo file for w/r") ;
exit(EXIT_FAILURE) ;
}
if((!(fdr2 = fopen(SECOND_FIFO, "r"))))
{
perror("Cannot open fifo file for w/r") ;
exit(EXIT_FAILURE) ;
}
for(; counter < N ; counter++)
{
st_search_prime = raffle_prime(st_search_prime) ;
**fprintf(fdw1, "%u\n", st_search_prime) ;
fflush(fdw1) ;**
printf("%u\n", st_search_prime) ;
fscanf(fdr2, "%u\n", &st_search_prime) ;
}
fclose(fdw1) ;
fclose(fdr2) ;
exit(EXIT_SUCCESS) ;
}
void doChild2(unsigned int st_search_prime)
{
int counter = 0 ; //Counter for N successfully raffle .
FILE* fdw2 ;
FILE* fdr1 ;
if((!(fdr1 = fopen(FIRST_FIFO, "r"))))
{
perror("Cannot open fifo file for w/r") ;
exit(EXIT_FAILURE) ;
}
if(!(fdw2 = fopen(SECOND_FIFO, "w")))
{
perror("Cannot open fifo file for w/r") ;
exit(EXIT_FAILURE) ;
}
for(; counter < N ; counter++)
{
**fscanf(fdr1, "%u\n", &st_search_prime);**
st_search_prime = raffle_prime(st_search_prime) ;
fprintf(fdw2, "%u\n", st_search_prime) ;
fflush(fdw2) ;
printf("%u\n", st_search_prime) ;
}
fclose(fdr1) ;
fclose(fdw2) ;
exit(EXIT_SUCCESS) ;
}
【问题讨论】:
-
考虑为固定字节数调用 read(),然后对 read 返回的字符串调用 sscanf。在管道上读取也将返回更少的字节 - fscanf 被阻塞,因为文件指针不在您假设的位置。 read() 不“关心”,只会返回那里的内容。
-
事实上,您的问题可能与缺少的代码片段有关。请提供MCVE。
标签: c