Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用两个线程从标准输入读取数据_C_Multithreading_Gcc_Pipe_Cat - Fatal编程技术网

C 使用两个线程从标准输入读取数据

C 使用两个线程从标准输入读取数据,c,multithreading,gcc,pipe,cat,C,Multithreading,Gcc,Pipe,Cat,我试图使用两个线程从标准输入(stdin)读取数据,但无法正确读取数据。我尝试在Linux平台上使用gcc编译器。我正在尝试使用cat命令和管道读取数据 cat Test.txt | ./a.out 我得到如下输出: 我做错了什么 #include <pthread.h> #include <stdio.h> #include <string.h> #include <unistd.h> // Declaring mutex pthread_

我试图使用两个线程从标准输入(stdin)读取数据,但无法正确读取数据。我尝试在Linux平台上使用gcc编译器。我正在尝试使用cat命令和管道读取数据

cat Test.txt | ./a.out
我得到如下输出:

我做错了什么

#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

// Declaring mutex
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

void *input(void *ptr)
{

    while(1)
    {
        char str[20];
        memset(str, '\0', 20);
        int result;
        pthread_mutex_lock(&lock);
        result = read(STDIN_FILENO, str, sizeof str);
        if (result <= 0) 
        {
            printf("====\n");
            pthread_exit(NULL);
            return NULL;
        }

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

int main()
{
    pthread_t t1, t2;

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

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

    return 0;
}

%s
printf
格式说明符需要以null结尾的字符串。您正在向它传递一个不以null结尾的字符串。这会导致未定义的行为

我建议你换线

result=read(标准文件号、str、sizeof str)

致:

result=read(标准文件号,str,str-1的大小)

另外,在调用
pthread_exit
之前,应该解锁互斥锁,否则可能会出现死锁

与在整个数组上使用
memset
不同,添加行会更有效

str[result]='\0'


就在printf语句之前。

%s
需要以NUL结尾的字符串。请将文本输出显示为文本,而不是整个桌面的屏幕截图。
AAAAAAABBBCCCDDDDDDEFG
mmmmmmmmmmgggggggggwwwghgmaaaaabbb
rrrrrrrssghgmtttttddddrrr
a