gpt4 book ai didi

c - 管道和 fork

转载 作者:IT王子 更新时间:2023-10-29 00:32:16 25 4
gpt4 key购买 nike

该项目的目标是使用管道和 fork 来执行已经以多进程方式(每个参数一个进程)编写的行计数实用程序。我目前正在努力在扩展以处理多个参数之前让单个进程正常工作。

给定两个可执行文件,lc1lc2,我希望 lc2 建立到 lc1< 的标准输出文件描述符的管道,这样当 execlp("lc1", argv[1], NULL) 被调用时,输出将被
读入 while ((c= read(pipefd[0], readin, SIZE)) > 0)

根据我的 Unix 书,我应该使用 open、dup2、close 方法将 stdout 重定向到 stdin,这是我的代码:

int pid, c, i;
char *readin= (char *)malloc(sizeof(SIZE));

if (pipe(pipefd)== -1)
perror("Can't open a pipe\n");

for (i=1; i< argc; i++){
if ((pid= fork())==-1)
perror("Can't fork\n");

run(argv[i]);

}

//close pipe
close(1);
if (dup2(pipefd[0], 0)==-1)
perror("Can't redirect stdin");
close(pipefd[1]);

for (i=1; i< argc; i++){
if ((wait(NULL))== -1)
perror("Wait error");

while ((c= read(pipefd[0], readin, SIZE)) > 0){;
//print buf count
total += atoi(readin);
}
}

运行函数是

void run(char *f){
int fp;
if ((fp= open(f, O_RDONLY)) == -1)
perror("Can't open the file");

close(pipefd[0]);
dup2(pipefd[1], 1);
close(pipefd[1]);
execlp("ls1", f, NULL);
}

当我尝试执行这段代码时,我收到一个标准输入重定向错误,指出错误的文件描述符。为什么会发生这种情况,如有任何修复提示,我们将不胜感激。

最佳答案

run(argv[i]) 由父子执行,因为没有根据返回的 PID 分配功能,所以一个关闭另一个关闭。看下面的代码,他可以方便吗,我将在这种情况下使用代码示例。 :

int main()
{
int pipe_fd[2] = {0};
int pid = -1;
int status = -1;
int ret_value = INVALID_CMD;
int cmd_output_len = -1;
status = pipe(pipe_fd);
if(status<0)
{
perror("pipe create err");
}
else
{
pid = fork();
if(pid<0)
{
}
else if (pid == 0)
{
/*Child functionality*/
child_func(pipe_fd, cmd);
}
else
{
/*Parent functionality*/
cmd_output_len = parent_fun(pid, pipe_fd);
}
}
return ret_value;
}

int child_func(int pipe_fd[], const char * cmd)
{
int status = 5;
int read_fd = pipe_fd[0]; /*read file descriptor*/
int write_fd = pipe_fd[1]; /*write file descriptor*/

int exit_status = 0;

/*close read fd*/
close(read_fd);

/*dup2 stdout to write fd*/
//status = dup2(1, write_fd);
status = dup2(write_fd, 1);
if(status<0)
{
exit(-1);
}
else
{
system(cmd);
exit(0);
}
}


int parent_fun(int child_id, int pipe_fd[])
{
int status = -1;
int len = 0;
bool_e break_loop = FALSE;
int read_fd = pipe_fd[0]; /*read file descriptor*/
int write_fd = pipe_fd[1]; /*write file descriptor*/

/*close write fd*/
close(write_fd);

while(1)
{
sleep(1);
status = waitpid(child_id, &status, WNOHANG);
switch(status)
{
case 0:
/*Child is still active*/
printf("No process waiting to exit..\n");
len = do_ur_fun(read_fd);
write(1, output, len);
break;
/*case EINTR:
case ECHILD:
case EINVAL:
perror("waitpid error");
break_loop = TRUE;
break;*/
default:
if(status<0)
{
perror("waitpid error");
break_loop = TRUE;
len = -1;
}
else if(child_id == status)
{
/*Valid staus from child*/
len = read_output(read_fd, output);
//write(1, output, len);
break_loop = TRUE;
}
else
{
}
break;
}
if(TRUE == break_loop)
{
break;
}
}
return len;
}




int do_ur_fun (int read_fd)
{
/*Do your exec*/
}

关于c - 管道和 fork ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5901631/

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