使用管道在线程之间发送数据

时间:2014-06-15 15:53:53

标签: c linux multithreading posix

我有3个线程 - 我必须读取第一个中的内容,计算第二个中的字符,然后在第三个中输出。所以我在这里使用两根管子;第1 - 第2线程,第2 - 第3线程。

然而,它根本不起作用。我的意思是,我可以在控制台中键入字符串,但是没有任何事情发生,没有输出。

这里有什么问题?

此外,是否可以添加类似"在此处键入字符串:"在第一个线程的某个地方?在while循环中添加它似乎会产生奇怪的结果 - 它在运行程序后随机显示:P

以下是代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/stat.h>
#include <pthread.h>
#include <string.h>

int first[2];
int second[2];

void *input(void *ptr)
{
   while(1)
   {
      char str[100];
      int result;

      result = read(STDIN_FILENO, str, sizeof(str));
      if(result <= 0)
      {
         if(result == -1)
            perror("read");
         close(first[1]);
         exit(2);
      }
      if(write(first[1], str, result) != result)
      {
         perror("write");
         exit(2);
      }
   }
}

void *countChars(void *ptr)
{
   int result, result2, count = 0;
   char str[100];

   while(1)
   {
      result = read(first[0], str, sizeof(str));
      if(result <= 0)
      {
         if(result == -1)
            perror("read");
         close(first[0]);
         close(second[1]);
         exit(2);
      }
      if(write(STDOUT_FILENO, str, result) != result)
      {
         perror("write");
         exit(2);
      }

      while(str[count] != '\0') count++;

      write(second[1], &count, sizeof(count));
   }
}

void *output(void *ptr)
{
   int result2, count = 0;
   char str[100];

   while(1)
   {
      result2 = read(second[0], str, sizeof(str));
      if(result2 <= 0)
      {
         if(result2 == -1)
            perror("read");
         close(second[0]);
         exit(2);
      }
      if(write(STDOUT_FILENO, str, result2) != result2)
      {
         perror("write");
         exit(2);
      }

      while(str[count] != '\0') count++;

      printf("Writer: %d\n", count - 1);
   }
}

int main()
{
   pthread_t t1, t2, t3;

   if(pipe(first) == -1)
   {
      printf("First pipe error");
      exit(1);
   }

   if(pipe(second) == -1)
   {
      printf("Second pipe error");
      exit(1);
   }

   pthread_create(&t1, NULL, input, NULL);
   pthread_create(&t2, NULL, countChars, NULL);
   pthread_create(&t3, NULL, output, NULL);

   pthread_join(t1, NULL);
   pthread_join(t2, NULL);
   pthread_join(t3, NULL);

   return 0;
}

1 个答案:

答案 0 :(得分:1)

您希望countChars函数计算到换行符并写入int“count”

void *countChars(void *ptr)
{
   int result, result2, count = 0;
   char str[100];

   while(1)
   {
      result = read(first[0], str, sizeof(str));
      if(result <= 0)
      {
         if(result == -1)
            perror("read");
         close(first[0]);
         close(second[1]);
         exit(2);
      }

      if(write(STDOUT_FILENO, str, result) != result)
      {
         perror("write");
         exit(2);
      }

      //while(str[count] != '\0') count++;
      while(str[count] != '\n') count++;

      write(second[1], &count, sizeof(count));

      count = 0;
   }
}

output函数将int的size读入int变量。

void *output(void *ptr)
{
   int result2, count = 0;
   //char str[100];

   while(1)
   {
      //result2 = read(second[0], str, sizeof(str));
      result2 = read(second[0], &count, sizeof(count));
      if(result2 < sizeof(count))
      {
         close(second[0]);
         exit(2);
      }

      printf("Writer: %d\n", count);
   }
}

这样可以正常工作,因为只有countChars才会写入第二个管道。管道写入/读取是原子的,直到PIPE_BUF字符,并且int小于此值,因此读取是可预测的。