写入命名管道不显示字符串的完整内容

时间:2014-12-11 13:18:08

标签: c named-pipes

我正在尝试从2个命名管道中读取数据并将其写入另一个命名管道,该管道连接来自2个输入的内容。但为什么我的输出只显示第一次输入的字符串?

这是我的代码:

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>

#define MAX_REC_SIZE 1024

int open_fifo(char *name, int mode) {
   mode = mode == O_RDONLY ? (O_RDONLY | O_NONBLOCK): mode;
   int fd;
   if (access(name, F_OK) == -1) {
      if(mkfifo(name, 0777) != 0) {
         fprintf(stderr, "Could not create fifo %s\n", name);
         exit(EXIT_FAILURE);
      }
   }
   fd = open(name, mode);;
   return fd;
}

void read_fifo(int fd, char *out_r) {
   memset (out_r, '\0', MAX_REC_SIZE);
   do {
      if(read(fd, out_r, MAX_REC_SIZE) > 0) {
         out_r = strtok(out_r, "\n");
         return;
      }
   } while (1);
}

void write_fifo(int fd, char *out_w) {
    write(fd, out_w, sizeof(out_w));
}

int main()
{
   int pipe_fd[3], i;
   char *pipe_nm[] = {"./in_pipe_1", "./in_pipe_2", "./out_pipe_1"};
   int read_mode = O_RDONLY;
   int write_mode = O_WRONLY;
   char out[MAX_REC_SIZE];
   char out_store[MAX_REC_SIZE];

   for(i=0; i<3; i++) {
      pipe_fd[i] = open_fifo(pipe_nm[i], i == 2 ? write_mode : read_mode);
   }

   read_fifo(pipe_fd[0], out);
   strcpy(out_store, out);
   read_fifo(pipe_fd[1], out);
   strcat(out_store, out);
   strcat(out_store, "\n");
   write_fifo(pipe_fd[2], out_store);
   return 0;
}

1 个答案:

答案 0 :(得分:3)

您的代码的可疑部分是:

write(fd, out_w, sizeof(out_w))

此处,out_w不是数组,sizeof运算符会产生char *指针的大小,而不是块的长度。

您应该将out_store的长度传递给write_fifo函数。

此外,我在使用strtok功能时并不确定您的意图。