程序打开同一个命名管道并用 C 多次写入

Program opens the same named pipe and writes to it many times with C

我创建了两个程序,它们将通过命名管道进行通信,一个从中读取,另一个向其中写入。它现在工作得很好,除了它打开并写入同一个 fifo 正好 3 次。第一次接触C和管道,不明白为什么要这样写三遍。你能看出为什么写了三遍吗?

writing.c

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

#define BUFFSIZE 512
#define err(mess) { fprintf(stderr,"Error: %s.", mess); exit(1); }


void writing(char *s)
{
    int fd;
    ssize_t n;

    char buf[BUFFSIZE];

    printf("writing to %s\n",s);
    if ( (fd = open(s, O_WRONLY)) < 0)
        err("open")

    while( (n = read(STDIN_FILENO, buf, sizeof buf -1) ) > 0) {
    buf[n-1] = '[=10=]';

        printf("Received: %s\n", buf);

        if ( write(fd, buf, n) != n) { 
            err("write");
        }
    if(strcmp(buf,"END")==0){
           printf("%s","exit");
       break;
        }
    }
    close(fd);
}

char* concat(const char *s1, const char *s2)
{
    char *result = malloc(strlen(s1)+strlen(s2)+1);//+1 for the zero-terminator
    strcpy(result, s1);
    strcat(result, s2);
    return result;
}

int file_stat(char *argv){

           int isfifo = 0;
       struct stat sb;

           printf("%s",argv);

           if (stat(argv, &sb) == -1) {
               perror("stat");
               exit(EXIT_FAILURE);
           }

           printf("File type:                ");

           if (sb.st_mode & S_IFMT == S_IFIFO) {
            printf("FIFO/pipe\n");
        isfifo = 1;

           }

           printf("Ownership:                UID=%ld   GID=%ld\n",
                   (long) sb.st_uid, (long) sb.st_gid);


           //exit(EXIT_SUCCESS);
       return isfifo;



}


int main(int argc, char *argv[])
{
    // READ ALL FILES IN DIRECTORY
    if (argc != 2) {
               fprintf(stderr, "Usage: %s /<pathname>/\n", argv[0]);
               exit(EXIT_FAILURE);
           }
    DIR *d;
    struct dirent *dir;
    if ((d = opendir (argv[1])) != NULL) {
        /* print all the files and directories within directory */
        while ((dir = readdir (d)) != NULL) {
                printf ("%s\n", dir->d_name);
            char* s = concat(argv[1], dir->d_name);
            if (file_stat(s) == 1) {
                writing(s);
            }
            else {
                mkfifo("fifo_x", 0666);
                writing("fifo_x");      
            }
            free(s);
        }
        closedir (d);
    }
    else {
        /* could not open directory */
        perror ("error: ");
        return EXIT_FAILURE;
    }
}

除了 "reading" 函数和调用 reading() 之外,读取文件是一样的 阅读

void reading(char *s)
{
    int fd;
    ssize_t n;
    char buf[BUFFSIZE];
    printf("%s",s);

    if ( (fd = open(s, O_RDONLY)) < 0)
        err("open");


    while( (n = read(fd, buf, sizeof buf - 1) ) > 0) {

    buf[n-1] = '[=11=]';
    if(strcmp(buf,"END")==0){
           printf("%s\n", "exit");
       break;
        }
    buf[n-1] = '\n';
    if ( write(STDOUT_FILENO, buf, n) != n) { 
            exit(1);
        }
    }
    close(fd);
}

输出

/home/..File type:                Ownership:                UID=0   GID=0
writing to fifo_x
END
Received: END
exitola
/home/olaFile type:                Ownership:                UID=1001   GID=1001
writing to fifo_x
END
Received: END
exit.
/home/.File type:                Ownership:                UID=0   GID=0
writing to fifo_x
END
Received: END
exit

您在调用程序时使用其路径名的目录中有三个文件。这三个文件都不是 fifo 的,所以对于每个你写入 fifo_x.

文件名是

    .
    ..
    olaFile

也许您应该明确排除这些文件

    .
    ..

恰好在 linux 中的每个目录中,代表当前目录 . 和父目录 ...