两个线程 - 从STDIN读取文本并通过管道发送

时间:2014-06-14 10:41:02

标签: c linux multithreading

我想创建两个线程 - 一个将从stdin读取字符串,另一个将在屏幕上显示它(通过管道进行通信)。我怎样才能做到这一点?这就是我到目前为止所写的内容:

#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];

void *input(void *ptr)
{
   close(first[1]);

   while(1)
   {
      char str[10];
      int result;

      read(STDIN_FILENO, str, 10);

      result = read(first[0], &str, 1);
      if(result != 1)
      {
         perror("read");
         exit(3);
      }

      printf("Reader: %s\n", str);
   }
}

void *output(void *ptr)
{
   close(first[0]);

   int result;
   char str[10];

   while(1)
   {
      result = write(first[1], &str, 1);
      if(result != 1)
      {
         perror("write");
         exit(2);
      }

      printf("Writer: %s\n", str);
   }
}

int main()
{
   pthread_t t1, t2;

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

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

   return 0;
}

我可以编译它,但是尝试运行它会显示错误“write:Bad file descriptor”。我实际上找不到任何关于管道的正确教程,只有几个短代码。我该怎么做?

1 个答案:

答案 0 :(得分:2)

  • 您的管道读/写方向已经混淆,并且您正在关闭线程中的管道。

  • 您需要检查从stdin读取的字节数并发送到管道。

  • 您不能直接对从管道读取的数据使用printf(),该数据可能不是字符串(可能不是nul终止,也可能是二进制数据)

  • 您需要实际创建管道。

这就是你想要的&#34;输入&#34;线程:

  1. 从stdin读取
  2. 将步骤1中读取的数据写入管道
  3. &#34;输出&#34;螺纹:

    1. 从管道中读取
    2. 将步骤1中读取的数据写入stdout
    3. 所以这应该是:

      void *input(void *ptr)
      {
      
         while(1)
         {
            char str[10];
            int result;
      
            result = read(STDIN_FILENO, str, sizeof str);
            if (result <= 0) 
            {
               if(result == -1)
                  perror("read");
               close(first[1]);
               return NULL;
            }
            if(write(first[1], str, result) != result)
            {
               perror("write");
               exit(3);
            }
      
            printf("Reader: %s\n", str);
         }
      }
      
      void *output(void *ptr)
      {
      
         int result;
         char str[10];
      
         while(1)
         {
            result = read(first[0], str, sizeof str);
            if(result <= 0)
            {
               if(result == -1)
                  perror("read");
               close(first[0]);
               return NULL;
            }
      
            if (write(STDOUT_FILENO, str, result) != result) {
                perror("write");
                exit(4);
            }
         }
      }
      
      int main()
      {
         pthread_t t1, t2;
         pipe(first);
      ...
      }