gpt4 book ai didi

c - Shell 重定向导致无限打印到终端

转载 作者:太空宇宙 更新时间:2023-11-03 23:45:10 25 4
gpt4 key购买 nike

所以我正在用 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 包括我的主要内容:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com