我想创建两个线程 - 一个将从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”。我实际上找不到任何关于管道的正确教程,只有几个短代码。我该怎么做?
答案 0 :(得分:2)
您的管道读/写方向已经混淆,并且您正在关闭线程中的管道。
您需要检查从stdin读取的字节数并发送到管道。
您不能直接对从管道读取的数据使用printf(),该数据可能不是字符串(可能不是nul终止,也可能是二进制数据)
您需要实际创建管道。
这就是你想要的&#34;输入&#34;线程:
&#34;输出&#34;螺纹:
所以这应该是:
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);
...
}