gpt4 book ai didi

c - 在不创建特定管道描述符的情况下进行管道传输

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

我有一个项目可以在 C 上复制 shell 命令。其中一个命令是 |需要使用管道制作。我的其他命令有效,但我无法使 (ls | sort) 工作。它说ls 无法访问 |: 没有那个文件或目录ls 无法访问排序:没有这样的文件或目录

我希望有人能帮我弄清楚如何解决管道问题?它从尝试制作它开始,这样我就不必为每个命令制作一个单独的管道,所以我通过一个 for 循环运行它。

执行大部分工作的函数是execute。 Runsource 和 Rundest 在管道中进行信息的打开和传输。

void execute(char *cmdline)
{
int pid, async;
char *args[MAX_ARGS];
char *pargs[MAX_ARGS];
int i = 1;
int j;

int nargs = get_args(cmdline, args);
if (nargs <= 0)
return;

if (!strcmp(args[0], "quit") || !strcmp(args[0], "exit"))
{
exit(0);
}

int npargs = get_pipe(cmdline, pargs);
if (npargs > 1)
{
int pdes[2];
pipe(pdes);

for (j = 0; i < npargs; j++)
{
nargs = get_args(pargs[j], pargs);
runsource(pdes, j, pargs, npargs);
rundest(pdes, j + 1, pargs, npargs);
close(pdes[0]);
close(pdes[1]);
}
}
else
{
while (args[i] < args[nargs])
{
if (strcmp(args[i], ">"))
{
freopen(args[i + 1], "w", stdout);
args[i] = NULL;
}

if (strcmp(args[i], ">>"))
{
freopen(args[i + 1], "a", stdout);
args[i] = NULL;
}

if (strcmp(args[i], "<"))
{
freopen(args[i + 1], "r", stdin);
args[i] = NULL;
}
}
}


/* check if async call */
if (!strcmp(args[nargs - 1], "&"))
{
async = 1;
args[--nargs] = 0;
}
else
async = 0;

pid = fork();
if (pid == 0) /* child process */
{
execvp(args[0], args);
/* return only when exec fails */
perror("exec failed");
exit(-1);
}
else if (pid > 0) /* parent process */
{
if (!async)
waitpid(pid, NULL, 0);
else
printf("this is an async call\n");
}
else /* error occurred */
{
perror("fork failed");
exit(1);
}
}

int main(int argc, char *argv[])
{
char cmdline[BUFFSIZE];

for ( ; ; )
{
printf("COP4338$ ");
if (fgets(cmdline, BUFFSIZE, stdin) == NULL)
{
perror("fgets failed");
exit(1);
}
execute(cmdline);
}
return 0;
}

最佳答案

我看到您有特殊的代码来处理“<”和“>”符号,但我在您的答案中没有看到任何处理“|”的代码,所以您甚至期望它如何工作?现在的问题是你传递的是“|”作为 ls 的参数,而实际上您应该在管道之后作为命令运行它,将 ls 的标准输出发送到该命令的标准输入。

您为什么要尝试通过手动解析内容和设置管道从头开始发明一个 shell?你不能只使用 system()改为执行 shell 命令?

关于c - 在不创建特定管道描述符的情况下进行管道传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43552967/

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