2015-12-25 2 views
2

У меня есть проблема, связанная с функциями fifos и write() и read(). Я создаю fifo через функцию mkfifo(), тогда я использую fork() для генерации двух процессов: первый открывается и записывает на fifo через write(); другой открывается и читается через read(). Моя проблема в том, что write() пишет на stdout, и read() ждет меня, чтобы написать что-то на stdin и нажать Enter, точно так же, как scanf(), таким образом, не используя fifo. Я действительно не знаю, что делать дальше, я пробовал все и пока не нашел проблем в Интернете. Я использую gcc-компилятор и Xubuntu 15.10.write() и read() не работают на stdio вместо fifo

генератор процесса

int main (void) { 

    int f = mkfifo("try", S_IRUSR | S_IWUSR); 
    if (f < 0) 
     printf("mkfifo went fine\n"); 
    else 
     printf("mkfifo went wrong\n"); 
    pid_t fo = fork(); 
    switch (fo) { 
    case -1: 
     printf("err\n"); 
    case 0: 
     execlp("prova_fifo2", "prova_fifo2", NULL); 
    default: 
     execlp("prova_fifo", "prova_fifo", NULL); 
    } 

    return (0); 
} 

Writer (ака prova_fifo)

int main (void) { 

    int fd; 
    if (fd = open("try", O_WRONLY) == -1) 
     printf("Error opening FIFO\n"); 

    char buf[6]; 
    sprintf(buf, "hello"); 
    int writer = write(fd, buf, strlen(buf)); 
    printf("%d", writer); 
    return (0); 
} 

Reader (ака prova_fifo2)

int main (void) { 

    int fd; 
    if (fd = open("try", O_RDONLY) ==-1) 
    printf("Errore in apertura FIFO\n"); 

    char buf[6]; 
    read(fd,&buf, strlen(buf)); //tried removing the "&", didn't work 
    printf("READ: %s", buf); 
    return (0); 
} 

ПРИМЕЧАНИЕ Я включаю в себя все необходимые библиотеки, код компилируется и запускается. Моя единственная проблема - это упомянутая выше.

+0

'чтения (FD, и ЬиЕ , strlen (buf)), этот атрибут uninntialised, aand strlen() может делать ужасные вещи, если он не находит 0. также: read() * может * читать больше, чем фактический размер, в маленький буфер – wildplasser

+0

относительно блок кода, начинающийся с 'if (f <0)' 1), если 'f' меньше 0, тогда вызов mkfifo() завершился неудачно. В этом случае вызовите: 'perror (mkfifo failed); exit (EXIT_FAILURE);'. Потому что, если функция не работает, в коде нет причины продолжать, а вызов 'perror()' будет выводить то, что система думает, что проблема была – user3629249

+0

, когда вызов 'execlp()' failed, вызов вернется.поэтому каждый вызов 'execlp()' должен сопровождаться чем-то вроде: 'perror (" execlp failed "); exit (EXIT_FAILURE); ' – user3629249

ответ

1

Это operator precedence вопрос, выражение fd=open("try", O_WRONLY)==-1 эквивалентно fd=(open("try", O_WRONLY)==-1), который является наиболее определенно не то, что вы хотите, как и присвоит результат open(...)==-1 к fd который будет ложным (т.е. 0, который является дескриптор файла для стандартного введите), если файл может быть найден, и 1, если файл не может быть найден.

Вам необходимо сделать (fd=open("try", O_WRONLY))==-1.

+0

Спасибо! Это исправлено! Это было так просто! –

1

Вы не можете разумно позвонить strlen() на неинициализированный массив char. Вы должны сделать:

read(fd, buf, sizeof(buf)); 

вместо этого.

Обратите внимание, что read() не будет нулевым прекратить ваш массив и printf() рассчитывает получить такую ​​вещь для %s, так что вы можете изменить все, что нужно:

char buf[7] = {0}; 
if (read(fd, buf, sizeof(buf) - 1) > 0) { 
    printf("READ: %s\n", buf); 
} 
+0

Спасибо, код, который я написал, был просто образцом реального «огромного» кода, который я разрабатываю. –