【问题标题】:Following xv6/Linux forking and waitpid processes遵循 xv6/Linux 分叉和 waitpid 进程
【发布时间】:2018-07-06 10:59:30
【问题描述】:
int main()
{
    int count = 0;
    int pid;
    if ( !(pid=fork()))
    {
        while (((count<2) && (pid=fork()) ) {
            count++;
            printf("%d",count)
       }
       if(count>0)
       {
           printf("%d", count);
       }
    }
    if (pid) {
        waitpid(pid,NULL,0);
        count = count<<1;
        printf("%d", count)
    }
}

我无法阅读这段代码。我无法弄清楚进行了多少系统调用,甚至无法远程跟踪它们。这导致我无法理解输出是如何工作的。我假设调度程序可以做任何事情。所有可能的输出是什么?进行了多少系统调用?

【问题讨论】:

  • 我包含了代码的图像,除非您看不到 imgur 链接。我也会添加代码。
  • 要计算 xv6 中的系统调用,您有两个选择,手动计算它们,或者编写一个程序来这样做。对于手动计数,可以在user.h 中找到可用系统调用的列表。在上面的代码中,forkwait 是显式系统调用。如果您查看printf 的代码,您会发现它也进行了系统调用write

标签: fork system-calls waitpid xv6


【解决方案1】:

使用strace -f ./myprogram 启动以跟踪所有系统调用。

通过查看代码,将创建大约 3 个额外的进程。

【讨论】:

  • 请注意,strace 在 xv6 中不可用。 OP 在他们的问题中列出了 Linux,但这样做并不正确。 xv6 是一个超简单的 Unix 变体。
猜你喜欢
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 2012-11-09
相关资源
最近更新 更多