gpt4 book ai didi

c - C语言实现linux下shell的输入输出

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

大家好,我知道这是一个非常流行的实现,所以我想我不需要解释太多。现在我在 shell 中做的是管道操作,在将它复制到我的大 shell 之前,我想看看它在“ls -l | tail -n 2”的示例中是否有效。所以这是我的代码,在我的代码末尾它做了什么什么都没有,它没有写任何东西而且我没有遇到任何段错误。感谢各位 helper !C代码:

#include <unistd.h>
#include <stdio.h>
#include <string.h>

#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>

#define OUT 1
#define IN 0

int main ()
{
int fd,secondSon,firstSon;
int inAndOut[2];

char* lsArgs[2];
lsArgs[0]= "ls";
lsArgs[1]= "-l";

char* tailArgs[3];
tailArgs[0]="tail";
tailArgs[1]="-n";
tailArgs[2]="2";

pipe(inAndOut);

firstSon = fork();
if(firstSon==0)
{
fd =dup2(inAndOut[OUT],STDOUT_FILENO);
close(fd);
execvp(lsArgs[0],lsArgs);
}
else
{
close(inAndOut[OUT]);
}
secondSon = fork();
if(secondSon==0)
{
fd =dup2(inAndOut[IN],STDIN_FILENO);
close(fd);
execvp(tailArgs[0],tailArgs);

}
else
{
waitpid(-1,&firstSon,0);
waitpid(-1,&secondSon,0);
close(inAndOut[IN]);
}
return 0;
}

最佳答案

有几个问题。

一个

fd =dup2(inAndOut[OUT],STDOUT_FILENO);
close(fd);

dup2 返回新的文件描述符,立即关闭它没有意义。你想关闭旧的。当你在做的时候,你想关闭管道的另一半。

替换两次出现的 close(fd)
close(inAndOut[IN]);
close(inAndOut[OUT]);

两个

您需要以 NULL 终止您的参数列表。添加最后一个元素:

char* lsArgs[3];
lsArgs[0]= "ls";
lsArgs[1]= "-l";
lsArgs[2]= NULL;

类似地在其他参数列表中。

关于c - C语言实现linux下shell的输入输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41793916/

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