我正在使用 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
也许我们可以找到您的问题。
我是一名优秀的程序员,十分优秀!