有人可以请解释使用dup2之后检查fd [0]!= STDIN_FILENO,因为从我了解fd [0]!= STDIN_FILENO将失败,dup2仍然会返回除STDIN_FILENO以外的东西,只是试图了解一些示例代码,谢谢,如果有人可以解释为什么使用excelp这将是一个很大的问题。dup2后fd [0]!= STDIN_FILENO
int fd[2];
pid_t pid;
if(argc != 2) {
fprintf(stderr, "Must be specify exactly 1 file\n");
exit(0);
}
if(pipe(fd) < 0)
exit(1);./
pid = fork();
switch (pid) {
case -1:
exit(1);
case 0:
close(fd[1]);
//here
if(fd[0] != STDIN_FILENO) {
if(dup2(fd[0], STDIN_FILENO) != STDIN_FILENO)
exit(3);
close(fd[0]);
}
if(execlp("tr", "tr", "[a-z]", "[A-Z]", (char *) 0) < 0)
exit(4);
break;
default:
close(fd[0]);
// and here
if(fd[1] != STDIN_FILENO) {
if(dup2(fd[1], STDIN_FILENO) != STDIN_FILENO)
exit(5);
close(fd[1]);
}
if(execlp("cat", "cat", argv[1], (char *) 0) < 0)
exit(4);
break;
}
return 0;
有没有人理解为什么代码使用* unidirectional *管道的* write * end作为* stdin *?此代码看起来不正确。 – thejh 2013-03-28 09:15:30
谢谢大家!!!!! – cincybengal 2013-03-28 09:24:00
@thejh是的,默认(父母)的情况是错误的...那些应该是STDOUT_FILENO – 2013-03-28 09:24:03