gpt4 book ai didi

c - 在 shell 中实现管道

转载 作者:行者123 更新时间:2023-11-30 18:04:51 26 4
gpt4 key购买 nike

我正在尝试在一个简单的外壳中实现管道,但无法使其工作。有人可以建议我可能做错了什么吗?阅读其他类似的帖子,但其他帖子中应用的逻辑不同。当我运行程序时给出如下命令:cat shell.c | grep int 它给出了损坏的管道错误。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#define BUFFER_SIZE 1<<16
#define ARR_SIZE 1<<16

void parse_args(char *buffer, char** args,
size_t args_size, size_t *nargs)
{
char *buf_args[args_size]; /* You need C99 */
char **cp;
char *wbuf;
size_t i, j;

wbuf=buffer;
buf_args[0]=buffer;
args[0] =buffer;

for(cp=buf_args; (*cp=strsep(&wbuf, " \n\t")) != NULL ;){
if ((*cp != '\0') && (++cp >= &buf_args[args_size]))
break;
}

for (j=i=0; buf_args[i]!=NULL; i++){
if(strlen(buf_args[i])>0)
args[j++]=buf_args[i];
}

*nargs=j;
args[j]=NULL;
}


int main(int argc, char *argv[], char *envp[]){
char buffer[BUFFER_SIZE];
char *args[ARR_SIZE];

int *ret_status;
size_t nargs;
pid_t pid;
size_t j;
int pipe_fd[2];
pipe(pipe_fd); // should pipe be placed here?
while(1){
printf("$ ");
fgets(buffer, BUFFER_SIZE, stdin);
parse_args(buffer, args, ARR_SIZE, &nargs);

if (nargs==0) continue;
if (!strcmp(args[0], "exit" ) ) exit(0);
pid = fork();
if(pid==0)
{
dup2(pipe_fd[0],0);
close(pipe_fd[1]);

j=execvp(args[0], args);
if(j)
{
puts(strerror(errno));
exit(127);
}

}else{
dup2(pipe_fd[1],1);
close(pipe_fd[0]);
pid = wait(ret_status);
}
}
return 0;
}

最佳答案

当你的while循环结束时,父进程循环回来并再次fork,问题是你已经在父进程中关闭了管道的一端,所以它会在子进程中关闭。要修复此问题,请确保两个管道在循环结束时关闭,然后在循环内重新调用管道函数。

关于c - 在 shell 中实现管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7292033/

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