2014-01-08 2 views
0

Мне нужно иметь дело с назначением, и я должен использовать файл FIFO для IPC.Проблемы с использованием fgets

Основная проблема заключается в том, что я застрял на части fget. Я уже открываю файл, но когда я пытаюсь прочитать данные, хранящиеся на нем, программа просто перестает работать. Это действительно не висит, программа просто ничего не делает.

Я уверен, что это проблема с syscall fgets, потому что я отлаживал, и проблема проявляется только тогда, когда я включаю строку fgets() в код.

// ESCRITURA DENTRO DEL ARCHIVO FIFO QUE ABRIRA EJ2. // Creamos лос FIFOs, comprobando дие нет 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

опечатка? 'msgre' ->' msgrec' – BLUEPIXY

ответ

2

Изменение второй FOPEN вызова из режима записи дописывания fp = fopen("fichero1", "w+"); в

fp = fopen("fichero1", "r"); /* read mode */ 

I, также заметить, это -

if (fgets(msgrec, sizeof(msgrec), fp) == NULL){ // msgrec, not msgre. 
+0

Привет. Я пробовал это с таким же результатом. Я не знаю, что происходит, я просмотрел несколько документов об этом, и я делаю правильные вещи (очевидно, нет). – user3174971

+0

Большое спасибо, я выложу весь код. Я намерен изменить значение msgre. Проблема связана с чтением из файла fifo. Я пробовал менять лады для записи (со всеми необходимыми изменениями файла), и это не работает. Я могу открыть файл, закрыть файл, а также записать в файл (я думаю), но к тому времени, когда я пытаюсь прочитать контент FIFO, он просто ничего не делает. Большое спасибо за вашу помощь. Очень ценю вашу помощь. – user3174971

0

Я предполагаю, что вы работаете в системе Unix/Linux. Вы можете заменить вызовы библиотеки fopen, fputs, fgets с соответствующими необработанными системными вызовами open, write, read и посмотреть, что произойдет. Системные вызовы не выполняют буферизацию пользовательского пространства, поэтому отладку может быть проще.

Главный трюк с FIFO заключается в том, что блокировки open блокируются до тех пор, пока не откроется другой конец FIFO.

+0

Я думаю, что проблема связана с этой «закрывающей» проблемой. но я не ошибаюсь. Я просматриваю все переменные, и программа хорошо компилируется. Я думаю, что, возможно, FIFO не открыт для чтения или чего-то еще. – user3174971

+0

Я действительно использую Linux/Unix, верно :-) – user3174971

+0

Наконец-то я нашел проблему. Я закрыл файл fifo, прежде чем открывать его с другой стороны. Я был именно тем, что вы сказали. Большое спасибо. Так грустно, что я не могу голосовать. Большое спасибо всем – user3174971

Смежные вопросы