【问题标题】:Running fork inside a loop produces unexpected results (measuring process switch time)在循环中运行 fork 会产生意想不到的结果(测量进程切换时间)
【发布时间】:2015-02-18 08:58:02
【问题描述】:

我正在编写一个程序来测量执行进程切换所需的时间。为了做到这一点,我让父母给它的孩子写一个字节的消息,然后孩子读它。

我的问题在这个循环中:

for(i=0; i<2; i++)
{
    if(fork()==0) //child process, read
    {
        close(pipefd[1]);
        read(pipefd[0]);
        close(pipefd[0]);
    }

    else //parent process
    {
        close(pipefd[0]);
        write(pipefd[1]);
        close(pipefd[0]);
    }
}

为了测试叉子撞击父子节点的频率,我输入了一个 printf 语句,我在屏幕上打印了大约 15 个语句。考虑到循环应该只运行两次,这怎么可能?

【问题讨论】:

标签: c operating-system


【解决方案1】:

这是因为每个子进程都会创建其他进程。

if 块执行后,每个子进程将在循环开始处返回并再次返回fork(),直到所有子进程中的i == 2

编辑:

为了避免这种情况,我建议使用这样的东西:

if(fork() == 0)
{
    //Do stuff
    break;
}

也许这不是最优雅的方式,但应该可以。

【讨论】:

  • 谢谢。关于我如何只在父母和孩子之间交流的任何想法?这个想法是我会实现一个时钟和时间来发送/接收一个字节消息(因为这会强制进程切换),但我不知道该怎么做,因为我似乎应该只打电话fork() 一次。
  • 仍然没有解释 15 个输出......你只会得到 4 个进程,应该给出 4 个输出。
  • @user120920 请查看我的编辑并告诉我它是否有效。
  • @thang 我同意你的观点,但我认为问题还是一样。
猜你喜欢
  • 2012-05-22
  • 2015-07-22
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-02
相关资源
最近更新 更多