gpt4 book ai didi

c - 我应该在这段代码中的什么地方使用 wait 和 waitpid?

转载 作者:太空宇宙 更新时间:2023-11-04 04:06:13 27 4
gpt4 key购买 nike

我写了一个程序来模拟'$ls -l | wc -c ' 类似于使用管道的命令。现在我无法找出我应该在这段代码中的什么地方使用 wait 或 waitpid。

还有我应该在哪里关闭管道?请查看我的代码并提出建议。

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

char *cmd_one_tokens[MAX]; /* Array of pointer to hold tokens of first command */
char *cmd_two_tokens[MAX]; /* Array of pointer to hold tokens of second command */

pid_t pid_one = -1 , /* variable to hold process id of first sub process */
pid_two = -1 ; /* variable to hold process id of second sub process */
int status = -1 ; /* variable to read the status of the child process */
int pipe_fd[2] = {-1,-1}; /* Array to hold descriptors returned by pipe sys call */
int ret_val =-1 ; /* variable to hold return values by system calls */

/*Validate Number of command line arguments */
if(3 != argc)
{
printf("Provide Appropriate Arguments \n <lab3> < \"arg1\" > < \"arg2\" > \n");
_exit(FAILURE);

}
/*Parse first command and get the tokens */
parse_command(argv[1],cmd_one_tokens);
/*Parse second command and get the tokens */
parse_command(argv[2],cmd_two_tokens);


/* Create pipe */
ret_val=pipe(pipe_fd);
/*Error check */
if(ERROR==ret_val)
{
perror("Pipe creation error \n");
_exit(FAILURE);
}
/*Fork First Child */
pid_one = fork() ;
//Error check
if( 0 == pid_one ) /*child process block */
{

/* redirect stdout to pipe's write end for sub process one*/
dup2(pipe_fd[1],1);

/*close pipe read end */
close(pipe_fd[0]);

execvp(cmd_one_tokens[0],cmd_one_tokens);

/* if execvp returns then if must have failed */
//Error check

}
else /*main process block */
{

/*Wait for first sub process to finish */
waitpid ( pid_two , &status ,0); // <-------changes

/*Fork second subprocess */
pid_two = fork();
//Error check
if( 0 == pid_two ) /*second child process block */
{
/* redirect stdin to pipe's read end for sub process two */
dup2(pipe_fd[0],0);

/*close pipe write end */
close(pipe_fd[1]);

execvp(cmd_two_tokens[0] , cmd_two_tokens);
/* if execvp returns then if must have failed */
//Error check

}
else /*main process block */
{
status=-1; /*reset status */

/*Waiting for the second sub process to finish in No hang fashion */
waitpid ( pid_two , &status ,0); // <-------changes

}
}
return(SUCCESS);

}/*End of main */

最佳答案

您可以在父进程中放置一个 while 循环(在生成子进程之后)连续调用 wait 直到两个子进程都终止:

while (wait(&status) != -1);

在您的特定情况下,您可以避免 waitpid

关于c - 我应该在这段代码中的什么地方使用 wait 和 waitpid?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5611030/

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