无法理解系统调用

时间:2019-03-31 23:09:47

标签: linux system-calls

我对Linux系统调用还很陌生,在理解这些调用的行为方式时遇到了麻烦,因此我试图通过分析一些示例代码的输出来了解这些调用的工作方式。我将为这些代码的输出提供解决方案。

在第一个代码中,变量pid获取fork的返回值。我们通过检查pid的值来检查子级创建是否成功。如果pid为负,我们将终止父进程,并且不打印任何内容。如果pid为正,则我们处于父进程中,我们将打印父进程的pid并终止父进程。如果pid为零,则我们处于子进程中,或者执行execv(进入睡眠状态1秒钟,不打印任何内容),或者打印子进程的pid。由于父进程和子进程都同时运行,因此我们在这里有2种情况。第一种是先运行父进程,然后运行子进程,第二种情况是先运行子进程,然后运行父进程。

在第二个代码中,父进程和子进程都同时运行,因此,这里我们还将有2个场景。在第一个场景中,我们先通过打印0到子进程开始,然后在值上加4,最后以状态4退出,在父进程中,我们跳过等待,因为我们已经执行了子进程,然后WEXITSTATUS将4赋给value,然后value变成7我们继续打印,然后打印7,将value增加4并退出父进程,并将value作为退出参数。在第二个场景中,我们从父流程开始,等待子流程完成执行,因此我们在父流程中执行子流程,其结果与第一个场景相同。

第一个代码:-

pid_t pid = fork();

if (pid < 0)
{
  exit(1);
}

else if (pid > 0)
{
  printf("%d", getpid());
  exit(0);
}

else
{
  char *const argv[] = {"sleep", "1", NULL};
  execv("/bin/sleep", argv);
  printf("%d", getpid());
}

第二个代码:-

int value = 0;

if (fork() != 0)
{
  wait(&value);
  value = WEXITSTATUS(value);
  value += 3;
}

printf("%d\n", value);
value += 4;
exit(value);

我想念什么吗?我的解决方案错了吗?如果是这样,那么我很乐意听到一个解释,谢谢。

0 个答案:

没有答案