Как правильно использовать трубу в цикле, верно ли мое?

Я хочу знать, правильно ли я использую pipe, этот код находится в дочернем процессе fork(), а pfd - указатель канала:

char buf[1024];
while(1){
    signal(SIGUSR1, OnSigUsr1);
    sleep(10000);
    if(get==1){
        get=0;
        close(pfd[1]);
        read(pfd[0], buf, sizeof(buf));
        close(pfd[0]);
    }
}

еще один эпизод кода в родительском коде:

char buffer[1024];
/*put something in buffer*/
close(pfd[0]);
if(write(pfd[1], buffer, strlen(buffer))==-1){
     printf("error write\n");
};
close(pfd[1]);
kill(fpid,SIGUSR1);

Моя проблема в том, что буфер может быть записан и получен из fork() только один раз, в следующий раз он не может быть снова записан в pipe и возвращен error write, Интересно, если я сделал это в каком-то месте неправильно? Благодарю.

2 ответа

Решение

В случае конвейера запись блокируется, если труба заполнена.

Обратите внимание, что данные, записанные в конец записи канала, буферизуются в ядре до тех пор, пока они не будут прочитаны из конца чтения канала.

child : Pfd[1] может быть закрыт в child, так как он не используется в child. Но не обязательно закрывать pfd[0], если он впоследствии будет использоваться потомком.

parent : Точно так же pfd[0] может быть закрыт в parent, так как он не используется в parent. Но не обязательно закрывать pfd[1], если впоследствии он будет использоваться родителем.

Вы можете записывать данные только в дескриптор открытого файла. Родитель выполняет close(pfd[1]); после записи в буфер, и ребенок выполняет close(pfd[0]); после прочтения буфера. Не закрывайте файловый дескриптор, если вы будете использовать его снова, но закройте все открытые файловые дескрипторы до выхода из программы.

Другие вопросы по тегам