2015-10-27 4 views
2
int main(){ 
    mkfifo("view",0666); 
    int pid = fork(); 
    if(pid==0){ 
    close(1); 
    int fd = open("view",O_WRONLY); 
    dup(fd); 
    execlp("cat", "cat", "users", NULL); 
    close(fd); 
    } 
    else{ 
    wait(NULL); 
    int fd = open("view",O_RDONLY); 
    char resp[100]; 
    read(fd,resp,20); 
    printf("%s\n",resp); 
    close(fd); 
    } 
} 

У меня есть этот кусок кода, но по какой-то причине, когда я его выполняю, procces зависает без печати и без выхода (я должен нажать CTRL + C). Любая идея почему? Я пробовал то же самое, но используя внутреннюю трубу, и это сработало.Комбинируйте вилку, fifo и execlp?

ответ

0

От человека mkfifo:

После того, как вы создали специальный файл FIFO таким образом, любой процесс может открыть его для чтения или записи, так же, как обычный файл. Однако он должен быть открыт с обоих концов одновременно, прежде чем вы сможете выполнить любые операции ввода или вывода на нем. Открытие FIFO для чтения обычно блоков до тех пор, пока какой-либо другой процесс не откроет тот же FIFO для записи, и наоборот.

Родительский процесс ожидает в wait(NULL) для ребенка отделки, но ребенок ждет кого-то, чтобы открыть "view" на другом конце после вызова open("view",O_WRONLY).


Чтобы иметь действительный нулем строку, которую также необходимо инициализировать resp нулем char resp[100] = { 0 }; или положить ноль в конце выхода чтения:

ssize_t size = read(fd,resp,20); 
resp[size] = '\0'; 
0

Он отлично работает, если я удаляю wait (NULL) из родительского процесса. Но я действительно не знаю, почему.