我正在创建一个可以处理单个管道的简单shell。我有一些问题让我的文件描述符在这里工作。
int child_process_status;
int fds[2];
pid_t cpid1, cpid2;
pipe( fds );
if ( (cpid1 = fork()) == 0 ) {
close(1); /* close normal stdout */
dup( fds[1] ); /* make stdout same as fds[1] */
close( fds[0] ); /* we don’t need this */
fnd1 = find_fullpath( fullpath1, &p_cmd_array[0] );
if ( fnd1 ) {
if ( (cpid1 = fork()) == 0 ) {
execv( fullpath1, p_cmd_array[0].argv );
}
} else {
printf("Command \"%s\" found.\n", p_cmd_array[0].name);
return 1;
}
}
if ( (cpid2 = fork()) == 0 ) {
close(0); /* close normal stdin */
dup( fds[0] ); /* make stdin same as fds[0] */
close( fds[1] ); /* we don’t need this */
fnd2 = find_fullpath( fullpath2, &p_cmd_array[1] );
if ( fnd2 ) {
if ( (cpid2 = fork()) == 0 ) {
execv( fullpath2, p_cmd_array[1].argv );
}
} else {
printf("Command \"%s\" found.\n", p_cmd_array[1].name);
return 1;
}
}
close( fds[0] );
close( fds[1] );
waitpid( cpid1, &child_process_status, 0 );
waitpid( cpid2, &child_process_status, 0 );
正如你所看到的,除了fork / exec / wait发生的部分外,我已经抽象出来了。其他一切都很好,因此超出了这个范围。我正在关注这个我处理文件描述符的方式,因为我认为我的问题就在于此。
例如,我输入的内容如下:ls -ln | wc -l
我得到wc: stdin: read: Bad file descriptor
,之后就会挂起。
非常感谢任何帮助。