我有这个代码:当第一个孩子向第二个孩子发送数据时程序卡住了,第二个孩子做 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) ;
}