【发布时间】:2016-05-08 21:32:41
【问题描述】:
所以我正在用 C 语言编写一个可以执行 STDOUT 重定向的简单 shell。我正在从用户那里读取一个字符串,将其拆分为参数,然后将其提供给 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;
}
}
EDIT 修正了代码中的一个错字,没什么大不了的。 编辑 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 重定向的命令可以正常工作。
【问题讨论】:
-
也许是colde调用这个函数的问题?我能发现的唯一错误是您在从未打开/初始化过的父进程中关闭了
fd。 -
@mata,因为我正在分叉,父母是否也得到了文件的副本?编辑:添加了我的主要内容。
-
@meta 似乎确实解决了问题,但我的问题仍然存在:父母是否也得到了文件的副本?
-
@Akaitenshi:父母怎么可能知道他的孩子在做什么?
fd在父进程中关闭它时有一些随机值。删除该行。这是错误的。 -
@nsilent22 看来我被误导了.. 感谢您的帮助:)