所以我用C编写了一个简单的shell,可以执行STDOUT重定向我正在从用户那里读取一个字符串,将其分成参数,然后将其馈送给exec但是当我第一次重定向输出时:创建我请求的文件并用正确的数据填充它,然后无限地在终端中打印命令结果我对dup2有什么不好吗?
这是我的重定向代码所有使用的变量都是全局变量,除了文件描述符。
int execRedirectCommand(){
int fd;
pid_t pid = fork();
// fork failed
if(pid == -1){
char* error = strerror(errno);
printf("fork: %s\n", error);
return -1;
}
//Child process
else if(pid == 0){
fd = open(fileName, O_WRONLY | O_CREAT | O_TRUNC, 0755);
if(fd == -1){
char* error = strerror(errno);
printf("open:%s\n", error);
return -1;
}
dup2(fd, STDOUT_FILENO);
close(fd);
execvp(payloadArgv[0], payloadArgv);
// execvp failed
char* error = strerror(errno);
printf("pdsh:%s:%s\n", payloadArgv[0], error);
return -1;
}
// Parent process
else{
close(fd);
fileName = NULL;
// Wait for child process to finish
int childStatus;
waitpid(pid, &childStatus, 0);
return 0;
}
}
编辑修复了代码中的一个错别字。
编辑2包括my main:
int main(){
setSigHandler();
char* user = getlogin();
while(1){
printf("[%s]-->$", user);
getNextCommand(payload);
if(!strcmp(payload, "\n")) continue;
if(!strcmp(payload, "close")) break;
parseCommandString();
if(fileName != NULL){
execRedirectCommand();
}else{
execSimpleCommand();
}
}
return 0; }
注意:没有STDOUT重定向的命令可以正常工作。
最佳答案
感谢mata和nsilent22指出这一点不需要父进程中的close(fd)。
关于c - Shell重定向导致无限打印到终端,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35113481/