【问题标题】:Child process never executes after forkfork 后子进程永远不会执行
【发布时间】:2019-10-24 16:43:28
【问题描述】:

我必须制作一个 C 程序,给父级一个字符串,父级编辑它,放入管道,然后子级验证它并将其发送回。出于某种原因,只有父级执行。我希望父母发送文本,然后等待孩子执行,然后阅读答案。但是代码完全忽略了孩子。

这是sn-p:

char response[10];
pid_t pid = fork();
int p[2];
pipe(p);
if(pid!=0)
{
    char username[255];
     CutString(8,command,username); // a function of mine i verified 
     write(p[1],username,sizeof(username));
     close(p[1]);
     wait(NULL);
     read(p[0],response,8);//the answer is always 8 bytes
     close(p[0]);
}
else //never gets here
{
     char buffer[255];
     size_t bufferIndex=0;
     char ch;
     while (ch != '\0')
     {
         read(p[0],&ch,1);
         buffer[bufferIndex++]=ch;
     }
     close(p[0]);
     f=fopen("config.txt","r");
     write(p[1],SearchInFile(f,buffer),8);
     close(p[1]);
}

【问题讨论】:

  • 分叉前不应该先打开管道吗?
  • //never gets here -- 我很难相信。如果fork() 成功,则if 的两个分支都会被执行。这不是问题。
  • 这也是令我惊讶的地方。由于某些原因,它只是没有。我在每一行都做了一个 printf ,但没有显示任何内容。
  • 如果fork() 有效,则有两个进程。 pipe() 会有多少电话?会有多少个管道...
  • 您可以在 gdb 下运行,设置“follow-fork-mode child”,然后逐步执行代码。这将允许您单步调试/调试子部件

标签: c pipe fork


【解决方案1】:

上面代码的'child'部分错误很少,导致它执行很快,没有副作用,然后退出。

  1. “while (ch != 0)”依赖于未初始化的“ch”变量。在我的构建 (cc -g) 中,ch 被初始化为零,导致 while 循环的执行为零。
  2. 没有测试来检查 fopen (config.txt) 是否真的有效。如果不存在,代码可能会崩溃。
  3. 在写入 p[1] (write(p[1]) 时,输入部分 (p[0]) 已经关闭。很可能导致 SIGPIPE。

旁注:目前尚不清楚该程序试图做什么。

编辑 2019-10-25:

可能的其他问题:

  1. 如果未初始化的 ch(在子部分中)以非零值开头,则代码可能会在“读取”语句中进入等待永远模式,因为没有任何内容写入管道。

【讨论】:

    猜你喜欢
    • 2014-01-21
    • 2020-01-23
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 2022-08-18
    相关资源
    最近更新 更多