gpt4 book ai didi

c - C中管道命令的问题

转载 作者:太空狗 更新时间:2023-10-29 16:49:51 24 4
gpt4 key购买 nike

我正在尝试用 C 为 Unix 创建一个简单的 shell。我已经能够完成所有命令的解析和执行,但我在管道方面遇到了问题。我认为问题是我没有连接到正确的管道以输入第二个命令。

例如,如果我键入“ls | wc”,它会在“wc”命令后暂停,我认为这是因为它正在等待输入。我认为问题是当我使用 dup2(reading[i],0) 时,它没有连接到正确的管道。

我知道这是一个有点宽泛的问题,但如果我能得到任何指示,我将不胜感激。下面是创建新进程并尝试通过管道传输它们的代码。

    int fileds[2];
int reading[num_cmds];
int writing[num_cmds];

int p;
for(p=0; p < num_cmds; p++)
{
reading[p] = -1;
writing[p] = -1;
}

int j;
for(j=0; j < num_cmds-1; j++) //Create pipes for commands
{
int fileds[2];
pipe(fileds);
reading[j+1] = fileds[0];
writing[j] = fileds[1];
}

int i = 0;
for(i = 0; i < num_cmds;i++)
{
cmd_args = parse_cmd(cmds[i],output_file,input_file,&run_bg); //Get command and args

pid_t childpid;
int status;
childpid=fork();

if (childpid >= 0)
{
if (childpid == 0)
{
if(writing[i] != -1)
{
dup2(writing[i],1);
close(writing[i]);
}

if(reading[i] != -1)
{
dup2(reading[i],0);
close(reading[i]);
}

int h;
for(h = 0; h < num_cmds; h++)
{
close(writing[h]);
close(reading[h]);
}

if(execvp(cmd_args[0],cmd_args) == -1)
{
perror("Problem with command");
exit(0);
}
}
else
{
wait(&status);
int m;
for(m = 0; m < num_cmds; m++)
{
if( writing[m] != -1) close(writing[m]);
if( reading[m] != -1) close(reading[m]);
}
}
}
else
{
perror("fork");
continue;
}


input_file[0] = 0;
output_file[0] = 0;
run_bg = 0;
}

}



更新:多亏了理查德,我才弄明白了。这是以错误的顺序关闭文件描述符和根本不关闭某些文件描述符的组合。这是工作代码。

int fileds[2];
int reading[num_cmds];
int writing[num_cmds];

int p;
for(p=0; p < num_cmds; p++)
{
reading[p] = -1;
writing[p] = -1;
}

int j;
for(j=0; j < num_cmds-1; j++)
{
int fileds[2];
pipe(fileds);
reading[j+1] = fileds[0];
writing[j] = fileds[1];
}

int i = 0;
for(i = 0; i < num_cmds;i++)
{
cmd_args = parse_cmd(cmds[i],output_file,input_file,&run_bg);

pid_t childpid;
int status;
childpid=fork();

if (childpid >= 0)
{
if (childpid == 0)
{
if(writing[i] != -1)
{
close(1);
dup2(writing[i],1);
}

if(reading[i] != -1)
{
close(0);
dup2(reading[i],0);
}

if(execvp(cmd_args[0],cmd_args) == -1)
{
perror("Problem with command");
exit(0);
}
}
else
{

wait(&status);
close(writing[i]);

if(i > 0)
{
close(reading[i]);
}
}
}
else
{
perror("fork");
}


input_file[0] = 0;
output_file[0] = 0;
run_bg = 0;
}

最佳答案

我认为您的问题可能是您等待循环内的每个进程,然后关闭所有文件描述符。这使得文件描述符对于下一次调用 dup2() 无效,并导致下一个进程的标准输入保持不变。

只是猜测,我还没有运行代码。

关于c - C中管道命令的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1694706/

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