为什么使用命名管道在C中给出随机字符?

时间:2017-08-05 14:57:34

标签: c pipe

我在Linux中使用mkfifo命令。 这是我的代码:

#include <stdio.h>
#include <sys/types.h>  // mkfifo
#include <sys/stat.h>   // mkfifo
#include <fcntl.h>      // O_WRONLY
#include <string.h>

int main(){
    char* filename = "myf";
    int res = mkfifo(filename, 0777); 
    pid_t x = fork();
    if(x){
        char buff[4];
        res = open("myf", O_RDONLY);
        if(res == -1){
            printf("problem opening fifo\n");
        }
        while(read(res, buff, 4)){
            printf("Father:  %s\n", buff);
        }
    }
    else{
        int toFath = open (filename, O_WRONLY);
        char buff [4];
        strcpy(buff, "hi");
        write(toFath, buff, strlen(buff));
        strcpy(buff, "bye");
        write(toFath, buff, strlen(buff));
        close(toFath);
    }
    return 0;
}

但它打印出来:

Father:  hi@
Father:  bye

我不明白为什么有这些我没有写过的字符(@)。我知道strcpy使用null终止符复制字符串,所以当父进程打印出来时,它应该停在null终止符上,为什么还没有?

2 个答案:

答案 0 :(得分:1)

strlen(buff)返回3,因此write()将输出buff的前3个字节

答案 1 :(得分:0)

第一个char buff[4]未初始化。因此,read(res, buff, 4)可能会返回不是&#39; \ 0&#39;终止。

修复,使用此char buff[4] = {0}初始化第一个buff。