gpt4 book ai didi

c - C 管道操作失败

转载 作者:太空宇宙 更新时间:2023-11-04 03:52:39 24 4
gpt4 key购买 nike

我正在尝试实现一个简单的 shell。管道不工作,因为,第二个 execve(如果你想知道,我必须使用 execve,而不是 execvp),声明命令未找到或者它只是失败并退出。这是我的管道代码。



switch(fork()) {
情况1:
致命的(“第一个 fork 在管道中失败了!”);
案例 0:
休息;
默认:
等待(状态);
返回(状态);
}

如果(管道(pipe_line)== -1){
致命的(“管道失败!”);
}

开关( fork ()){
情况1:
致命的(“第二个 fork 在管道中失败了!”);
案例 0:
dup2(pipe_line[1], 1);
关闭(管线[0]);
关闭(管线[1]);
execv(cmd[0].name, cmd[0].argv);
fatal("第一次执行失败!");
默认:
dup2(pipe_line[0], 0);
关闭(管线[0]);
关闭(管线[1]);
execv(cmd[1].name, cmd[1].argv);
fatal("第二次执行失败!");
}

fflush(标准输出);

注意: 1. 我已经测试以确保 cmd[1].name 是正确的......这样它就是正确的目录。那个 cmd[1].argv 不是空的......实际上包含了一些东西。我已经尝试了一切......但我无法弄清楚为什么它不起作用。

这是结果:



ls |厕所
wc:无效的零长度文件名
wc: ����|"):ʊЪ8��m����1��a������K��!����*"ks8����$: 没有那个文件或目录
wc: �]S�: 没有那个文件或目录
wc:无效的零长度文件名
wc: &�be: 没有那个文件或目录
wc: ����: 没有那个文件或目录
wc: T: 没有那个文件或目录
0 0 0 总计

编辑!!!我刚刚意识到,出于某种原因,它永远不会进入案例 0。Fork 不会失败......但它永远不会进入案例 0。为什么会这样?

非常感谢您的帮助!

最佳答案

看起来您的 nameargv 数据确实已损坏。考虑运行一个简单的测试:将 execve 调用替换为 printf 以打印每个 child 的命令和 argv(通过调用 将它们分开sleep() 在其中一个 child 中)。

关于c - C 管道操作失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19526458/

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