Именованные каналы - проблема с write () и read () - PullRequest
3 голосов
/ 09 августа 2010

Я занимаюсь программированием на C ++, под Linux.У меня есть два независимых процесса.Я должен обеспечить связь, используя именованный канал.

Читатель: -создание FIFO с использованием mkfifo - status = mkfifo (myFIFO, 0666) -открывает канал с использованием open - fifo = open (myFIFO, O_RDONLY) -читки из канала - num = read (fifo, temp, sizeof (temp))

Writer: -открывает канал - fifo = open (myFIFO, O_WRONLY);-записывает в канал - num = write (fifo, string, strlen (string));

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

Не могли бы вы мне помочь?Спасибо !!!

// read.cpp:

#define myFIFO "/temp/FIFO"

int main(){
    int num, fifo, status;
    char temp[32];

    if (status = mkfifo(myFIFO, 0666) < 0) { 
     printf("\n %s \n", strerror(errno));
     return 0;
     }

     if (fifo = open(myFIFO, O_RDONLY) < 0) { 
     printf("\n %s \n", strerror(errno));
     return 0;
     }

     if (num= read(fifo, temp, sizeof(temp)) < 0) { 
     printf("\n %s \n", strerror(errno));
     return 0;
     }

    printf("In FIFO is %s \n", temp);
}

И в другом файле:

// write.cpp:

#define myFIFO "/temp/FIFO"

int main() {
    int status, num, fifo;
    char string[]="Testing...";

     if (fifo = open(myFIFO, O_WRONLY) < 0) { 
     printf("\n %s \n", strerror(errno));
     return 0;
     }

     if (num= write(fifo, string, strlen(string)) < 0) { 
     printf("\n %s \n", strerror(errno));
     return 0;
     }
}

Ответы [ 2 ]

8 голосов
/ 09 августа 2010

У вас в коде по крайней мере четыре ошибки.Когда вы создаете FIFO, вы должны использовать файловый дескриптор, возвращаемый вызовом open.Однако вы сравниваете его с 0 и присваиваете результат сравнения переменной, которая должна была содержать дескриптор файла:

if (fifo = open(myFIFO, O_RDONLY) < 0) { 
    printf("\n %s \n", strerror(errno));
    return 0;
}

Правильный код должен выглядеть следующим образом:

fifo = open(myFIFO, O_RDONLY);
if (fifo < 0) { 
    printf("\n %s \n", strerror(errno));
    return 0;
}

Или вот так, если вы настаиваете на сохранении одной строки кода:

if ((fifo = open(myFIFO, O_RDONLY)) < 0) { 
    printf("\n %s \n", strerror(errno));
    return 0;
}

И точно такая же история с чтением:

if (num= read(fifo, temp, sizeof(temp)) < 0) { 
    printf("\n %s \n", strerror(errno));
    return 0;
}

Правильный код:

num = read(fifo, temp, sizeof(temp));
if (num < 0) { 
    printf("\n %s \n", strerror(errno));
    return 0;
}

В вашем коде, который пишет в FIFO, точно такие же две ошибки.

1 голос
/ 09 августа 2010

Проблема в вашем коде: fifo = open(myFIFO, O_WRONLY) < 0 оценивается как fifo = (open(myFIFO, O_WRONLY) < 0). Вы получаете ноль, потому что значение open() возвращает >= 0.

...