我在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终止符上,为什么还没有?
答案 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。