使用fgets的问题

时间:2014-01-08 20:38:02

标签: c fgets fifo

我必须处理一项任务,我必须使用一个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
    */

}

2 个答案:

答案 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系统。您可以使用相应的原始系统调用fopenfputsfgets替换库调用openwriteread,并查看会发生什么。系统调用不进行任何用户空间缓冲,因此调试可能更容易。

FIFO的主要技巧是open系统调用阻塞,直到FIFO的另一端打开。