linux

时间:2015-09-25 05:25:30

标签: c linux unix operating-system fork

我对fork()系统调用有这些愚蠢的疑虑, 如果有人请回答这些问题,请不胜感激。

  • fork()系统调用是否返回整数?如果是的话那么为什么 执行 fork()系统调用时,我们在 pid_t 中取值? 我们不能只写 int x = fork();

例如 -

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{  
pid_t pid;
pid=fork();
if(pid==0)
{
  printf("Child Process");
}
else if(pid>0)
{
     printf("Parent Process");
}
else
{
     printf("Unable to create");
}
}
  • 为什么我们执行pid = fork()而不是int x = fork()?
  • 上面的程序给出了一个输出 - Parent ProcessChild Process为什么呢 首先执行父进程而不是子进程?

我试过这段代码 -

   #include<stdio.h>
    int main()
    {
        int x;
        x=fork();
        if(x==0)
        {
            printf("Child Process");
        }
        else if(x>0)
        {
            printf("Parent Process");
        }
        else
        {
            printf("Unable to create");
        }
    }
  • 我试图在整数变量中收集fork()的值 在uccntu 15.04的gcc编译器中,它的工作正常,没有显示 任何错误并给出与上述程序相同的结果 给。
  • 这是编译器问题还是这段代码没问题? 即使我没有给头文件fies sys / types.h和unistd.h,仍然没有 显示任何错误。

有人可以    请回答我的问题?

2 个答案:

答案 0 :(得分:4)

使用pid_t表示源代码可移植到例如使用64位PID的系统。

进程按该顺序执行,因为这是调度程序决定执行它们的方式。

答案 1 :(得分:1)

这里pid_t是64位unsigned int,你可以在头文件中找到它。这基本上用于使程序可移植。

为什么父进程先行?

答: 1。在分叉进程之后,子进程必须复制父进程的内存布局(复制头部,堆栈,初始化数据,未初始化数据),因此父进程无关,所以在大多数情况下,父进程必须先执行。

  1. 但是在少数情况下,当孩子首先执行时,只有在父调度时间到期时才会执行。

  2. 在UNIX系统/ proc / sys / kernel / sched_runs_first中,将此值设为1以确保子进程首先运行。

  3. 总之,这种行为没有定义和不明确,最好使用任何同步方法。