2013-05-13 7 views
0

Я использовал FIFO для простой программы чтения/записи, где вход пользователя записывается на стандартный вывод функцией записи. Вопрос, однако, я могу запустить эту программу без создания дочернего процесса (с операцией fork()). Из того, что я вижу из примеров о FIFO, большинство программ чтения/записи с именованным каналом/FIFO выполняются с двумя файлами - один для чтения и один для записи. Могу ли я сделать все это в файле?Именованные трубы без дочернего процесса

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <errno.h> 

/* read from user */ 
void reader(char *namedpipe) { 
    char c; 
    int fd; 
    while (1) { 
    /* Read from keyboard */ 
    c = getchar();  
    fd = open(namedpipe, O_WRONLY); 
    write(fd, &c, 1); 
    fflush(stdout); 
    } 
} 

/* writes to screen */ 
void writer(char *namedpipe) { 
    char c; 
    int fd; 
    while (1) { 
    fd = open(namedpipe, O_RDONLY); 
    read(fd, &c, 1); 
    putchar(c); 
    } 
} 

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

    if (access("my_fifo", F_OK) == -1) { 
    res = mkfifo("my_fifo", 0777); 
    if (res < 0) { 
    return errno; 
    } 
    } 

    child = fork();  
    if (child == -1)  
     return errno; 
    if (child == 0) {  
     reader("my_fifo"); 
    } 
    else {     
     writer("my_fifo"); 
    } 


    return 0; 
}      

ответ

0

Вам нужно будет поместить замок в файл, иначе вы сможете пытаться читать, когда кто-то еще пишет. Вы также захотите сбросить буфер записи, или ваши изменения в fifo, возможно, не будут записаны до тех пор, пока буфер записи ядра не заполнится, а затем не будет записываться в файл (в linux запись не гарантирует, что запись происходит в тот момент Я вижу, что вы выполняете stdout, но вы также должны fsync в файловом дескрипторе. Это приведет к блокировке файла во время любой операции записи, чтобы никто не мог писать. Чтобы заблокировать файл для чтения, для использования семафора.

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