Есть ли способ узнать, если дескриптор файла, открытый для записи, кто-то слушает на стороне чтения? - PullRequest
0 голосов
/ 01 мая 2018

у меня есть fifo, открытый с одной стороны для чтения, а с другой стороны для записи, сторона чтения закрывает открытое им fd. Есть ли способ узнать, если читатель закрыл этот fd на стороне писателя? Я хочу, чтобы у писателя было какое-либо уведомление о том, готов ли читатель к чтению, потому что в противном случае мой писатель будет заблокирован при записи. writer.c:

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

int main()
{
    int fd;
     char * myfifo = "/tmp/fifo_pipe";
    /* create the FIFO (named pipe) */
    mkfifo(myfifo, 0666);

    /* write "Hi" to the FIFO */
    fd = open(myfifo, O_WRONLY);    

    write(fd, "Hey", sizeof("Hey"));

    /*here is there a posibilty of know that the read side hase close hi's side of the pipe before write? */

    write(fd, "test\n", strlen("test\n"));


    close(fd);

    /* remove the FIFO */
    unlink(myfifo);

    return 0;
}

reader.c:

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

#define MAX_BUF 1024

int main()
{
    int fd;
    char * myfifo = "/tmp/fifo_pipe";
    char buf[MAX_BUF];

    /* open, read, and display the message from the FIFO */
    fd = open(myfifo, O_RDONLY);
    read(fd, buf, MAX_BUF);
    printf("Received: %s\n", buf);
    close(fd);

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Вы можете использовать системную команду lsof для проверки информации о файлах, открытых процессами. Извлеките поле FD из вывода команды lsof и продолжайте. Для более подробной информации и примера, смотрите эту ссылку

В вашем случае, чтобы узнать количество процессов, прослушивающих ваш fifo, попробуйте выполнить приведенную ниже системную команду.

lsof /tmp/fifo_pipe | grep [0-9]r | wc -l

В C вы можете реализовать что-то вроде этого:

int i = 0;
FILE *fp;
char *command = "lsof /tmp/rjfifo | grep [0-9]r | wc -l";

fp = popen(command,"r");
if (fp != NULL){
    fscanf(fp,"%d",&i);
}

fclose(fp);
printf("Number of processes reading /tmp/fifo_pipe = %d \n",i);
0 голосов
/ 01 мая 2018

Запись в FIFO без считывателя вызовет SIGPIPE и в конечном итоге вернет -1 и значение errno будет равно EPIPE.

...