【问题标题】:Why isn't this if statement working? [closed]为什么这个 if 语句不起作用? [关闭]
【发布时间】:2014-03-18 06:23:25
【问题描述】:

我正在分叉,并在子进程中执行某个块。我的问题是我的子进程永远不会进入 if 语句。这是为什么呢?

if((x = strcmp(subargs[next_redirect], ">")) == 0)
            {
                pid = fork();
                fprintf(stderr, "my PID is %i\n", pid);
                if(pid == 0)
                {
                    fprintf(stderr, "the name of our file is %s\n", subargs[i+1]);
                    fp = creat(subargs[i+1], S_IWUSR | S_IRUSR);
                    dup2(fp, STDOUT_FILENO);
                    close(fp);
                    //create sub-command
                    makesubcommand(subcommand, subargs, last_redirect + 1, i);
                    execvp(subcommand[0], subcommand);
                }
                last_redirect = i;
                next_redirect = getnextredirect(subargs, i+2, subargc);
            }

我的输出是

my PID is 11080
my PID is 0

当你 fork 时,子进程收到的 PID 为 0,对吗?

我的问题是if(pid == 0){}。该块中的代码永远不会执行。

【问题讨论】:

  • 你将字符串与字符进行比较 ....">" 检查一次...
  • 分叉后你还在等,为什么?
  • @vinod:我很顺利。我的问题不是 strcmp。
  • 你的孩子大多不出来wait(0);
  • 在回答过程中大幅修改您的问题不是一个好主意,因为这可能会使某些答案难以理解。

标签: c if-statement fork pid


【解决方案1】:

由于wait() 系统调用,您的子进程无法访问if

系统调用 wait() 会阻塞调用进程,直到其子进程之一退出或收到信号。wait() 获取整数变量的地址并返回已完成进程的进程 ID。一些指示子进程完成状态的标志用整数指针传回。 wait() 的主要目的之一是等待子进程完成。

wait() 的执行可能有两种可能的情况。

  • 如果在调用 wait() 时至少有一个子进程在运行,则调用者将被阻塞,直到其子进程之一退出。在那一刻,调用者恢复执行。

  • 如果调用wait() 时没有子进程在运行,那么这个wait() 根本没有任何作用。也就是说,好像没有wait()。

所以删除wait() 系统调用。你的程序就可以正常运行了。

【讨论】:

  • wait()if 之后。
  • 我删除了 wait()。我仍然无法进入 if 语句。
  • fork 后是否可以尝试打印出 pid 并尝试以这种方式使用 pid。看看它是否解决了.. int child_id; printf ("我在程序里!\n"); child_id = fork(); if (child_id) { printf ("我是父母,快死了。再见!\n"); } else { printf ("我是孩子,快死了。再见!\n"); }
  • 我编辑了顶部的代码,并按照您的建议添加了一些调试行。输出列在代码下方,但仍然无法正常工作。
【解决方案2】:

检查代码中的 execvp 调用,可能有错误。可以查看wait的返回值来获取子pid或者-1。

【讨论】:

    【解决方案3】:

    抱歉。原来我的问题是

    fprintf(stderr, "the name of our file is %s\n", subargs[i+1]);
    

    我一直认为该块从未执行过,因为它不会打印任何内容。 事实证明,subargs 有问题。 感谢所有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      • 2014-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多