gpt4 book ai didi

c中管道破裂的原因

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

我正在使用 fork 和 execlp 在 c 中构建一个简单的 shell。我将获得一组由竖线分隔的命令。例如:ls -l |厕所-l。我正在尝试使用 c 实现一个简单的 shell 程序。出于某种奇怪的原因,我遇到了管道损坏错误。

void excueteCommand(commandNode* head, int input) {

int pfds[2] = { -1, -1 };

if (head->next != NULL) {

pipe(pfds);
}

if (fork() == 0) { /* child */

if (input != -1) {

dup2(input, 0);
close(input);
}

if (pfds[1] != -1) {

dup2(pfds[1], 1);
close(pfds[1]);
}

if (pfds[0] != -1) {

close(pfds[0]);
}

execlp(head->command, head->args, NULL);
exit(1);
}

else { /* parent */

if (input != -1) {
close(input);
}

if (pfds[1] != -1) {
close(pfds[1]);
}

if (head->next != NULL) {

thePipenizer(head->next, pfds[0]);
}
}
}

最佳答案

嗨,我不知道索引是什么。我制作了一个简单的程序,用于向您展示您所犯的一些错误。

int main()
{
int pfds[2] = { -1, -1 };
int input;
char *argvv = "";
char *tab = malloc(500);
int i;
int nbRead;
int stat;

input = dup(0);
if (pipe(pfds) == -1)
exit(-1);
if (fork() == 0)
{ /* child */
dup2(pfds[1], 1);
close(pfds[0]);
execlp("ls", argvv, NULL);
exit(-1);
}
else
{ /* parent */
close(pfds[1]);
wait(&stat);
do
{
nbRead = read(pfds[0], tab, 500);
for (i = 0; i < nbRead; i++)
printf("%c", tab[i]);
} while (nbRead > 0);
close(pfds[0]);
}
return (0);
}

首先:不要考虑 pfds[0] 和 pfds[1] 值,而是查看函数管道的返回值。函数管道在出错时返回 -1(参见 man pipe)。

其次:不要忘记关闭所有打开的fd,这对系统很重要。

如果你能告诉我们更多关于

input

也许我们可以找到您的问题。

关于c中管道破裂的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22135985/

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