我必须处理一项任务,我必须使用一个FIFO文件进行IPC。
主要问题是我被困在fget
部分。我已经打开了文件,但是当我尝试读取存储在其中的数据时,程序就停止工作了。它并没有真正挂起,程序根本没有做任何事情。
我很确定这是fgets
系统调用的问题,因为我一直在调试,只有当我在代码中包含fgets()
行时才会显示问题。
// ESCRITURA DENTRO DEL ARCHIVO FIFO QUE ABRIRA EJ2。 // Creamos los fifos,comprobando que no existen
mknod("fichero1", S_IFIFO|0777,0);
fp= fopen("fichero1", "w+"); //Abrimos el archivo fifo
if (fp==NULL){
printf("Fallo al abrir el archivo, no se encuentra");
exit(0);
}
fputs(msgrec, fp);
fclose(fp);
printf("El proceso P2 ha creado el archivo fichero1 y ha esctito el mensaje ");
fp = fopen("fichero1", "w+");
if (fgets(msgre, sizeof(msgrec), fp) == NULL){
printf("Fallo al leer el archivo");
exit(0);
}
printf("\n I´m here"); // DEBUGING LINE
//Here is how he code continues.
/*
printf(" Lo que esta en el earchivo que es: %s \n", msgre);
printf("%s \n", msgrec);
execv("Ej2", 0); //Ejecucion del archivo Ej2
*/
}
答案 0 :(得分:2)
将第二个fopen调用从写入追加模式fp = fopen("fichero1", "w+");
更改为
fp = fopen("fichero1", "r"); /* read mode */
我也注意到了这一点 -
if (fgets(msgrec, sizeof(msgrec), fp) == NULL){ // msgrec, not msgre.
答案 1 :(得分:0)
我假设您使用的是Unix / Linux系统。您可以使用相应的原始系统调用fopen
,fputs
,fgets
替换库调用open
,write
,read
,并查看会发生什么。系统调用不进行任何用户空间缓冲,因此调试可能更容易。
FIFO的主要技巧是open
系统调用阻塞,直到FIFO的另一端打开。