提问人:ahmed 提问时间:11/3/2023 最后编辑:halferahmed 更新时间:11/7/2023 访问量:31
C 重定向 STDIN 使用 dup2 不起作用
C redirecting STDIN not working using dup2
问:
我正在制作一个简单的 shell,当我传递诸如“ls > junk.txt”之类的命令时,我希望子进程获取 ls 的内容并将它们写入 junk.txt。当我这样做时,当前创建了一个名为junk .txt的文件,并将“junk.txt”写入该文件。为什么不写 ls 的内容?我用错了 dup2 吗?
argv 数组包含写入 shell 的完整命令。argvSec 应包含所有命令,不包括“<”或“>”。
int childExitMethod;
pid_t spwanPID = fork();
switch (spwanPID){
case -1:
last_exit_status = 1;
case 0:
token = strtok(command, " "); // Split the command into tokens
while (token != NULL) {//add in all tokens into arr
argv[i] = token;
token = strtok(NULL, " ");
i++;
}
argv[i] = NULL;
char* redirect_arg = NULL;
for (int i = 0; argv[i] != NULL; i++) {//Check if array contains any redirection
if (strcmp(argv[i], ">") == 0) {
redirect_arg = argv[i + 1];
} else {
argvSec[i2] = argv[i];
i2++;
}
}
argvSec[i2] = NULL;
if (redirect_arg != NULL) {
int fd_out = open(redirect_arg, O_WRONLY | O_CREAT | O_TRUNC, 0666);
if (fd_out == -1) {
last_exit_status = 1;
exit(1);
}
dup2(fd_out, STDOUT_FILENO); //redirect output
close(fd_out);
execvp(argvSec[0], argvSec);
} else {
execvp(argv[0], argv);
last_exit_status = 1;
exit(1);
}
default:
waitpid(spwanPID, &childExitMethod, 0); // Wait for the child
}
答: 暂无答案
评论
>
ls junk.txt