簡體   English   中英

在多個進程正在寫入命名管道的同時讀取命名管道

[英]Reading a named pipe while multiple processes are writing to it

什么樣的方法才是解決該問題的正確方法?

例如,我有一個名為write.c的程序,該程序具有4個子進程,並且這些子進程將其PID寫入單個全局命名管道。

另一個名為read.c程序應讀取此PID。

我有一種類似下面的方法,但是這種方法存在一些問題。它無法讀取所有PID,有時無法讀取其中的3個,有時甚至可以讀取其中的2個。

writer.c

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

int main(){ 
    int fd; 
    char * myfifo = "/tmp/myfifo"; //FIFO file
    char buffer[50]; 

    mkfifo(myfifo, 0666); //creating the FIFO

    for(int i=0;i<4;i++){ //creating 4 child process
        if(fork() == 0) { 
            fd = open(myfifo, O_WRONLY); //each child process opens the FIFO for writing their own PID.

            sprintf(buffer, "%d", getpid()); //each child process gets pid and assign it to buffer
            printf("write:%s\n", buffer);  // each child process prints to see the buffer clearly

            write(fd, buffer, strlen(buffer)+1); //each child process writes the buffer to the FIFO
            close(fd);

            exit(0); 
        } 
    } 
    for(int i=0;i<4;i++) { //waiting the termination of all 4 child processes.
        wait(NULL); 
    }
    //parent area
} 

reader.c

#include <stdio.h> 
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h> 
#include <time.h>
#include <string.h>
#include <fcntl.h> 

int main(int argc, char **argv) { 

    int fd1; 

    // FIFO file path 
    char * myfifo = "/tmp/myfifo"; 

    // Creating the named file(FIFO) 
    mkfifo(myfifo, 0666); 

    char str1[80]; //str2[80]; 
    while (1) 
    { 
        // First open in read only and read 
        fd1 = open(myfifo,O_RDONLY); 
        read(fd1, str1, 80); 

        // Print the read string and close 
        printf("read: %s\n", str1); 
        close(fd1); 
    } 
} 

這行將空字節寫入fifo:

write(fd, buffer, strlen(buffer)+1);

因此,如果管道中有兩個pid,則會讀取以下字符串:

1234\02345\0

並且printf將只打印到第一個\\0為止:

1234

要解決此問題,將PID轉換為二進制文件而不是格式化和解析文本會更容易:

作家:

    if(fork() == 0) { 
        fd = open(myfifo, O_WRONLY);
        pid_t pid = getpid();
        write(fd, &pid, sizeof(pid));
        close(fd);
        exit(0); 
    } 

讀者:

fd1 = open(myfifo,O_RDONLY); 
pid_t pid;
while (1) // whatever is your termination condition
{ 
    read(fd1, &pid, sizeof(pid)); 
    printf("read: %d\n", pid); 
} 
close(fd1); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM