这是我目前的代码片段:
int main ()
{
int pid, fd[2], i;
char comanda[1000], *var, vect[100][100], text[100];
if((pid = fork()) < 0 )
{
perror("fork error");
exit(1);
}
if(pid){
printf("enter command: \n");
scanf("%[^\t\n]", comanda);
close(fd[0]);
close(0);
var = strtok(comanda, " ");
i=0;
while(var != NULL)
{
strcpy(vect[i], var);
var = strtok(NULL, " ");
i++;
}
if(strcmp(vect[0], "login") == 0)
{
write(fd[1], "login", 5);
printf("I got login");
}
close(fd[1]);
wait(NULL);
}
else
{
close(fd[0]);
int i=0;
read(fd[0], &text, sizeof(text));
printf("This is the child ");
exit(0);
}
return 0;
}
而预期的输出是:
我得到的输出有点奇怪:
这有点奇怪,我想要的只是在父级中读取内容,在管道中写入并将其发送到子进程,该进程实际上应该对该值执行某些操作。
答案 0 :(得分:2)
无处初始化fd
数组,以便它实际上包含有效的文件描述符。因此,孩子对read
的调用立即失败,文件描述符无效(您应该检查所有系统调用的返回代码),这解释了孩子的“意外”输出。
在父级中(即在调用fork
之前),您需要按如下方式初始化fd
:
pipe(fd);
并删除
close(fd[0]);
来自孩子,因为你需要阅读那个fd。