gpt4 book ai didi

c - 将命令输出重定向到文件时文件描述符错误

转载 作者:行者123 更新时间:2023-11-30 17:41:07 26 4
gpt4 key购买 nike

我正在尝试编写调用函数以在我的伪shell中调用,但是虽然简单(一个命令)和管道案例可以工作,但当我尝试重定向时,它给我一个写入错误,指出文件描述符是错误的。 argv[] 包含第一个命令的名称和参数,argv[] 包含第二个命令的名称和参数;

int invoke(char *argv1[], char *argv2[], type_c tipo)
{
int pid, pfd[2], fid;

switch(tipo)
{
case(_SIMPLE):
pid=fork();
switch(pid) {
case 0:
execvp(argv1[0],argv1);
}
break;
case(_PIPE):
pipe(pfd);
pid=fork();
switch(pid) {
case 0:
close(1);
dup(pfd[1]);
close(pfd[0]);
close(pfd[1]);
execvp(argv1[0],argv1);
}
pid=fork();
switch(pid) {
case 0:
close(0);
dup(pfd[0]);
close(pfd[0]);
close(pfd[1]);
execvp(argv2[0],argv2);
}
close(pfd[0]);
close(pfd[1]);
break;
case(_REDIRECT):
pid=fork();
switch(pid) {
case 0:
close(fileno(stdout));
fid=open(argv2[0],O_CREAT|O_WRONLY);
dup(fid);
close(fid);
execvp(argv1[0],argv1);
}
break;
}
return pid;
}

为了测试它,在 main() 函数中,我编写了以下代码:

char *argv[2][3];
argv[0][0]="ls";
argv[0][1]="-l";
argv[0][2]=NULL;
argv[1][0]="test";
argv[1][1]=NULL;
pid=invoke(argv[0],argv[1],_REDIRECT);

那我能做什么呢? :/提前感谢大家

最佳答案

如果是_REDIRECT

  • 您首先要关闭标准输出。这意味着有一个空闲的文件描述符1
  • 现在,您将打开要将命令的输出发送到的文件。这直接在描述符编号 1 上打开。
  • 然后,您将复制这个新的文件描述符,这将在描述符3上打开相同的文件描述符(2 用于stderror)。
  • 现在,您将关闭之前位于 1 上的 fid。然后,ls 程序尝试打印到 fd 1,在本例中该文件已关闭,从而使其成为坏文件描述符。

有两种方法可以解决这个问题。

不需要额外的dup,您的代码可以完美运行。

close(fileno(stdout));
int fid=open(argv2[0],O_CREAT|O_WRONLY);
execvp(argv1[0],argv1);

为了让我们的生活更轻松,还有另一个函数dup2,它隐式关闭目标fd并使其成为fd的副本。

int  fid=open(argv2[0],O_CREAT|O_WRONLY);
dup2(fid,1);
close(fid);
execvp(argv1[0],argv1);

关于c - 将命令输出重定向到文件时文件描述符错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21260353/

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