我正在使用fork和execlp在c中构建一个简单的shell。我将获得一组由管道分隔的命令。例如:ls -l | wc -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]);
}
}
}
答案 0 :(得分: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,这对系统很重要。
如果你能告诉我们更多关于
的信息输入
也许我们可以找到你的问题。
答案 1 :(得分:0)
在父级中,尝试重置pfds。那就是:
if( pfds[1] != -1 ) {
close( pfds[1] );
pfds[1] = -1; /* Add this line */
}
通过将其设置为先前的值,后续子项很可能正在关闭您不希望它们关闭的文件描述符。