【问题标题】:The main process creates a new subprocess. This subprocess will create another subprocess, and so on until N processes are created主进程创建一个新的子进程。这个子进程会创建另一个子进程,以此类推,直到创建了 N 个进程
【发布时间】:2014-05-24 21:23:53
【问题描述】:

主进程创建一个新的子进程。这个子进程将创建另一个子进程, 以此类推,直到创建 N 个进程。 每个过程将使用管道通道与他的孩子讨论。 主进程(初始进程)会生成一个介于 1000 到 10000 之间的随机数,然后开始游戏。 游戏将在所有进程创建后开始。 每个进程将减去一个随机值(10 到 20 之间)并将新数字发送给他的孩子。 孩子将执行相同的操作并进一步发送号码。 当数字达到最后一个孩子时,游戏结束。此过程将仅打印收到的号码。

我试过这个:

int main()
{
    int i;
    int n;
    int c;
    int p1[2];
    int p2[2];

    if ( fork() > 0 ) {
        if ( n > 10000 )
            n = rand() % 10000 + 1;
        write(p2[0], &n, sizeof(int));
        read(p1[1], &n, sizeof(int));
    }

    for (i = 1; i <= N; i++) {
        if ( fork() == 0 ) {
            n = read(p2[1], &n, sizeof(int));
            if ( c > 20 ) {
                c = rand() % 20 + 1;
            }
            n = n - c;
            write(p1[0], &n, sizeof(int));
        }
    }
    printf("%d", n);
}

但我意识到我是在绕圈子,因为输出总是相同的数字,无论我使用多少个进程,事实上我实际上是在创建 N 个孩子而不是创建一个孩子,然后是孩子,等等。

有什么想法吗?

谢谢。

【问题讨论】:

  • 您的代码似乎有很多问题,这对 SO 来说太宽泛了。对于初学者,在使用它们之前初始化变量...
  • 另外,注意fork返回两次,在两个进程中(几乎)同时返回,返回值不同。你完全错过了处理(更不用说第三种可能性,失败和返回值 -1 并且没有新进程)。

标签: c fork pipe


【解决方案1】:

我看到的一个错误是 fork 不是变量,它是一个函数,更具体地说是一个系统调用。但是,您将其用作变量。

您应该在 if 语句中检查 f,而不是检查标准库中函数的地址

【讨论】:

  • 停止检查 fork() 并开始检查 f 是我的建议。
  • 好的,我做到了。它仍然无法正常工作。它只是多次打印相同的数字。但是感谢您的建议,我相信它在将来会有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
  • 2014-05-11
相关资源
最近更新 更多