pipe道到unistd.h阅读段错误

即时尝试pipe道读取,但它保持在第二次input后segfaulting。 我究竟做错了什么? 提前致谢。

$ ./read < <(python -c 'print "BBA\nBBADD\n",') Please enter your first name: buf= BBA BBA Please enter your last name: buf= Segmentation fault (core dumped) 

我附上阅读的代码作为参考,重要的部分是read()

 //read.c #include <stdio.h> #include <string.h> void prompt_name(char *name, char *msg){ char buf[4096]; puts(msg); read(0, buf, sizeof buf); puts("buf="); puts(buf); *strchr(buf, '\n') = 0; puts(buf); strncpy(name, buf, 20); puts(name); } void prompt_full_name(char *fullname) { char last[20]; char first[20]; prompt_name(first, "Please enter your first name: "); prompt_name(last, "Please enter your last name: "); strcpy(fullname, first); strcat(fullname, " "); strcat(fullname, last); } int main(int argc, char **argv){ char fullname[42]; prompt_full_name(fullname); printf("Welcome, %s\n", fullname); return 0; } 

`

read并不知道字符串的任何内容,所以它只是愉快地读取sizeof(buf)字符而没有NUL终止buf 。 调用puts(buf)会导致未定义的行为。

你不应该为简单的字符串I / O使用这样的低级函数; 更喜欢getline 。 如果你想使用read ,然后读取较小的块,每次调用检查返回值并使用它; 它告诉你读了多少。