gpt4 book ai didi

c - fork 和 Pipes 不能很好地工作,它们同时执行

转载 作者:行者123 更新时间:2023-11-30 14:23:15 25 4
gpt4 key购买 nike

这是我目前拥有的代码:

 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;
}

而预期的输出是:

  1. 输入命令:
  2. 我在这里输入命令-
  3. 他在管道里写
  4. 他写道“我登录了”
  5. 他进入 child 并处理我的文本

我得到的输出有点奇怪:

  1. 从父级“输入命令:”...然后
  2. “这就是 child ”来自 child ?!?!?!从哪里?!?!
  3. 要求输入,scanf
  4. 从家长处写入“我已登录”。

这有点奇怪,我想要的只是在父进程中读取一些内容,在管道中写入并将其发送到子进程,子进程实际上应该使用该值执行某些操作。

最佳答案

您无法在任何地方初始化 fd 数组,以便它实际上包含有效的文件描述符。因此,子进程对 read 的调用会立即失败,并出现无效的文件描述符(您应该检查所有系统调用的返回代码),这解释了子进程的“意外”输出。

在父级中(即在调用fork之前),您需要按如下方式初始化fd:

pipe(fd);

并删除

close(fd[0]);

来自子进程,因为您需要从该 fd 中读取内容。

关于c - fork 和 Pipes 不能很好地工作,它们同时执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13027585/

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