gpt4 book ai didi

C壳: Program hanging in first child

转载 作者:行者123 更新时间:2023-11-30 16:21:16 24 4
gpt4 key购买 nike

我创建了一个 C-shell 来执行用户输入的命令。此 shell 的要求之一是在处理管道调用时,第一个子进程通过 pipeline1 将其输出定向到父进程,然后父进程读取输出并通过 pipeline2 将其写入第二个子进程。我面临的问题是,当输入带有管道的参数时,程序卡在第一个子进程中并且不执行该参数。

下面给出的代码片段是负责执行管道命令的函数(我已经标记了它挂起的点):

void execPipeArgs(char** befPipe, char** aftPipe, int n_reads){

pid_t child_1, child_2;
int pipe1[2]; // Fd for pipe1
int pipe2[2]; // Fd for pipe2

// Create pipe1
if(pipe(pipe1) < 0){
printf("%s\n", "Failure! Pipe1 not created" );
exit(0);
}
// Create pipe2
if(pipe(pipe2) < 0){
printf("%s\n", "Failure! Pipe2 not created" );
exit(0);
}

// Create first Child
child_1 = fork();

// Check if fork successfull
if(child_1 < 0){
printf("%s\n", "ERROR! CHILD 1 NOT CREATED" );
exit(0);
}

// In first child
if(child_1 == 0){
***"THIS IS WHERE IT HANGS"***

dup2(pipe1[1],1);
close(pipe1[0]);
close(pipe2[0]);
close(pipe2[1]);

if(execvp(befPipe[0],befPipe) < 0){
printf("%s\n", "Command not executed in child_1" );
exit(0);
}
}

// In PARENT
else {
// Wait for child_1
wait(NULL);

int readCalls = 0;
int charCount = 0;
int bytesRead = 0;
char* byteBuffer[500];
close(pipe1[1]);

//Get number of bytes, read/write calls
while((bytesRead = read(pipe1[0],byteBuffer,n_reads)) != NULL){
readCalls++;
charCount = charCount + bytesRead;
//write to pipe2
write(pipe2[1],byteBuffer,bytesRead);
}

// Second Child
child_2 = fork();

// In child_2
if(child_2 == 0){
dup2(pipe2[0],0);
close(pipe2[1]);
close(pipe1[1]);
close(pipe1[0]);

if(execvp(aftPipe[0],aftPipe) < 0){
printf("%s\n", "Command not executed in child_2" );
exit(0);
}
} // if child_2 end
else{
// In Parent
wait(NULL);
}
}
} // end of execArgsPipe

我在 stackoverflow 上发现了类似的问题,但没有一个解决方案可以帮助我解决我的问题。最常见的答案是关于在适当的位置关闭管道,我已经尝试过,但我的程序仍然挂起。

任何帮助将不胜感激。

最佳答案

你怎么知道child_1挂起?是否是因为您尝试添加打印但在标准输出上没有看到任何内容?根据 dup2 手册页,'dup2() 使 newfd 成为 oldfd 的副本,如有必要,首先关闭 newfd'。因此child_1中的stdout现在是pipe1[1]的副本。因此,child_1 中的任何打印语句都不会显示在屏幕上。

您也可以查看此链接: Pipe implementation stuck at dup2 command

关于C壳: Program hanging in first child,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54959806/

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