gpt4 book ai didi

c - 使用 C 编程的 Linux 管道。通过管道重定向输入/输出

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

我是 Linux 的新手,但我已经成功地创建了自己的 shell。是时候在其中添加管道了。 (作业就是这么写的)。谁能向我解释一下如何做到这一点?我知道从理论上讲,它应该像那样工作。

unsigned char* child_results; //buffer to save results from child processes

for (int i = 0; i < 2; i++) {
pid = fork();

if (pid == 0) {
//if it's the first process to launch, close the read end of the pipe
//otherwise read what the parent writes to the pipe and then close the
//read end of the pipe

//call execvp()
}
else {
//if you've launched the first process, close the write end of the pipe
//otherwise write the contents of child_result to the child process
//and then close the write end of the pipe

//read from the child's pipe what it processed

//save the results in the child_results buffer

wait(NULL); //wait for the child to finish
}
}

但是,我无法让它工作。我整天都在做那件事,但仍然一无所获。我确实理解这个想法,但我无法让它发挥作用。有人可以帮助我吗?这是我的管道部分的代码:

for (int i = 0; i <= pipeline_count; i++) { 
int pdesc[2];
// creating pipe
pipe(pdesc);
int b = fork();
// child
if (b == 0) {
// 1st pipeline
if (i == 0) {
//<?>
}

// last pipeline
if (i == pipeline_count) {
//<?>
}

// inside pipeline
if (i > 0 && i < pipeline_count) {
//<?>
}
execvp(array[0], array);
}
else {
// parent
//<?>
wait(NULL);
}
}

这是一个shell命令的例子

ls -al | tr a-z A-Z

谢谢

最佳答案

您必须关闭子项上的输入流,并使用 dup 复制该 channel 的管道。 parent 对管道的另一侧做同样的事情。像这样:

b = fork();
if (b == 0) {
/* Close stdin, and duplicate the input side of the pipe over stdin */
dup2(0, pdesc[0]);
execlp(...);
}
else {
/* Close stdout, and duplicate the output side of the pipe over stdout */
dup2(1, pdesc[1]);
execlp(...);
}
...

我已经向您展示了如何在两个进程的情况下执行此操作,但您可以了解总体思路并将其适应其他情况。

希望对您有所帮助!

关于c - 使用 C 编程的 Linux 管道。通过管道重定向输入/输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13326476/

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