我在C中编写了一个基本shell,我已经实现了所有重定向运算符,但是,当我尝试重定向“cd”时,我遇到了这个问题:
cd完美无需任何输出重定向,但
当我试图做这样的事情时:
cd inexistant_directory > output_file
输出文件没有创建,在bash中,运行该命令会重定向stdout,正如我之前所说的重定向操作符与外部命令一样好
当我遇到cd命令时,我打电话给
char*path = get_path(parameters); //implemented by me, works on rest of the cases
int ret =chdir(path);
我不会在子进程中调用它,而是在父进程中调用它(shell进程本身)
我做错了什么?
谢谢,
PS:我运行它的操作系统是Ubuntu 12.10但是,代码是POSIX兼容的
LE:我不能发布整个代码,因为它大约有600行,
这是我的逻辑
if(internal_command) {
//do quit, exit or cd
} else if (variable_assignemt){
//do stuff
} else {
// external command
pid = fork();
if(pid == -1) {
//crash
} else if (pid == 0) {
do_redirects()
call_external_cmd
}
default :
wait(pid, &status);
所以,我认为要解决这个问题我需要在parrent中重定向stdout(shell进程) 并在执行命令后恢复它
答案 0 :(得分:0)
不在父进程(shell)中重定向stdout确实是原因 cd的不受欢迎的行为,我的解决方案如下:
if(we_have_out_redirection == 1) {
if(out != NULL) {
char *outParrent = out;
fflush(stdout);
outBackup = dup(STDOUT_FILENO); //I save stdout for future restoration
int fd = open(outParrent, O_WRONLY | O_CREAT | O_TRUNC, 0644); //open output file
int rc;
rc = dup2(fd, STDOUT_FILENO); //redirect stdout
retval = chdir(out); //execute cd command
//restore stdout
close(fd);
fflush(stdout);
rc = dup2(outBackup, 1);
close(outBackup);
}
}
感谢Jake223指出我忘记了重定向!