2015-09-25 160 views
-2

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

  • 是否叉()系统调用返回一个整数?如果是,那么为什么当
    执行fork()系统调用时,我们将其值设为pid_t
    我们不能只写int x = fork();

对于EG-

#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 =叉(),而INT X =叉()?
  • 上面的程序给出了一个输出 - 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"); 
     } 
    } 
  • 我试图收集叉的()中的整数变量 在Ubuntu 15.04的gcc编译的值和其工作正常,未示出 任何错误,并给出与上述程序 给予相同的结果。
  • 它是编译器问题还是这个代码罚款? 即使我没有给头文件sys/types.h和unistd.h,仍然不是 显示任何错误。

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

+0

你读了几遍* fork [2]的文档(http://man7.org/linux/man-pages/man2/fork.2.html)?你读过一本好的Linux或POSIX编程书吗?请参阅参考资料[here](http://stackoverflow.com/a/11681845/841108) –

+0

您应该使用[fflush(3)](http://man7.org/linux/man-pages/man3/fflush.3 .html),因为I/O被缓冲,你应该用'gcc -Wall -Wextra -g'编译 –

+0

@ BasileStarynkevitch-如果我先输入错误的代码,然后输入错误的代码,是否需要缓冲?尝试了错误的代码。 –

回答

3

使用pid_t意味着源代码对于例如使用64位PID的系统。

进程按该顺序执行,因为调度程序决定如何执行它们。

1

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

为什么父母过程第一?

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

  1. 但是在少数情况下,当孩子首先执行时,仅当父母排班时间到期时。

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

总之,这种行为没有被定义和undetminstic,最好使用任何同步方法。