Код моего форвок fifo c не работает должным образом

У меня проблемы со следующим кодом. Я выполняю лабораторное задание при использовании forks (создание процессов). Его простая программа, которая должна читать ввод с клавиатуры, а затем читать/записывать ее в fifo и отображать ее содержимое и записанные байты.

Когда я запускаю его, все кажется прекрасным, пока я не введу какой-нибудь текст. Родительское сообщение печати отображается нормально, но дочернее сообщение печати никогда не появляется, пока я не ввел свое второе сообщение, в котором он всегда говорит, что он написал 80 байтов, хотя я знаю, что это не так, и theres - это странный специальные символы повсюду.

Here is the executable on how the program should be: Linux: http://www.mediafire.com/?6806v24q6lz7dpc QNX: http://www.mediafire.com/?a9dhiwmrlx2ktkp

И мой код до сих пор:

#include
#include
#include 
#include 
#include 
#include 
#include 

int main(int argc, char *argv[]) {

    char FifoName[] = "fifoDan";
    int fd;
    pid_t retval;
    int size_read;
    char buff[80];
    int  size_written;

    mknod(FifoName, S_IFIFO | 0666, 0);

    //Check if its not equal to zero (ie: child process = 0)
     if (retval = fork ()) {

             printf ("Parent: Waiting for writers \n");

             if(fd = open(FifoName, O_RDONLY) == -1) {
                            perror( "Could not read the FIFO" );
                    return EXIT_FAILURE;
             }

             printf ("Parent: Received a writer \n");

             do {

                             int strsize;

                             size_read = read(fd, buff, sizeof(buff));

                             printf("Parent: read %d bytes: %s \n", size_read, buff);
                             fflush(stdout);

                            strsize = strlen(buff);

                            //  put a '\0' at the end of the data
                            buff[strsize] = '\0';


                     } while(size_read > 0);


                    close(fd);
                    waitpid(retval, NULL, NULL);

                    if(unlink(FifoName) != -1) {
                            return EXIT_SUCCESS;
                    } else {
                            return EXIT_FAILURE;
                    }


    } else {


      printf ("Child pid %d waiting for readers \n", getpid ());
      fflush(stdout);

       if(fd = open(FifoName, O_WRONLY) == -1) {
                            perror( "Could not read the FIFO" );
                    return EXIT_FAILURE;
            }

      printf ("Child: Got a reader, enter some stuff:\n");
      fflush(stdout);

      while(fgets(buff, 80, stdin) != NULL) {

                     int strsize;

                     strsize = strlen(buff);

                     if(strsize < 80) {
                             buff[strsize] = '\0';
                     }

                    size_written = write(fd, buff, sizeof(buff));

                    printf ("Child: wrote %d bytes \n", size_written);
                    fflush(stdout);

             }

             close(fd);

    }


}
0
nl ja de

1 ответы

Эта строка (например) не будет делать то, что вы думаете, что она делает:

if(fd = open(FifoName, O_WRONLY) == -1)

Оператор равенства имеет более высокий приоритет , чем оператор присваивания, поэтому то, что вы делаете, на самом деле это:

if(fd = (open(FifoName, O_WRONLY) == -1))

когда вы этого хотите:

if((fd = open(FifoName, O_WRONLY)) == -1)

Проблема с чтением/записью буфера связана с тем, что вы пишете весь буфер:

size_written = write(fd, buff, sizeof(buff));

Измените запись только фактической строки с помощью strsize .

4
добавлено
@ user1930558 Это потому, что вы пишете 80 байт. Вы пишете весь буфер, так как вы используете sizeof (buff) в вызове write .
добавлено автор Some programmer dude, источник
@ user1930558 См. мой обновленный ответ. вы уже имеете длину строки в strsize (кстати, не нужно заканчивать строку, fgets делает это для вы, иначе strlen не будет работать).
добавлено автор Some programmer dude, источник
+1. Это был мой опыт написания C в течение 27 лет, что, хотя законно писать задания внутри операторов if, это также прекрасный способ создания ошибок. Дополнительная строка кода для простого назначения не замедлит компиляцию. :)
добавлено автор Bob Murphy, источник
Спасибо за помощь. Он исправил проблему, с которой я столкнулся. Но теперь он говорит, что как родительский, так и дочерний ядро ​​читают/записывают 80 байт каждый раз, когда я что-то ввожу, вместо подсчета количества байтов, которые я вводил с моей клавиатуры. Может, я ошибаюсь?
добавлено автор user1930558, источник
Хм, но тогда что я должен писать? Как я могу узнать размер сообщения? Я не уверен, можно ли считать stdin
добавлено автор user1930558, источник
Linux Help
Linux Help
2 686 участник(ов)

Правила: https://telegra.ph/Pravila-Linux-Help-10-15

Linux Security
Linux Security
652 участник(ов)

Данная группа принципиально про безопасность и в частности про безопасность Linux. Прочие темы просим обсуждать в профильных чатах.

Linux Gaming RUS
Linux Gaming RUS
28 участник(ов)

Русскоязычный чатик, посвящённый играм на различных дистрибутивах Linux, а также wine, proton Arch Linux RU @ArchLinuxChatRU Gnome RU @gnome_ru