我对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()?
-
上面的程序给出了一个输出 - 父ProcessChild过程为什么它首先执行父进程而不是子进程?
我试过这段代码 -
#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编译器中的整数变量中收集fork()的值,并且它工作正常,没有显示任何错误,并给出与上述程序相同的结果 .
-
这是编译器问题还是这段代码没问题?即使我没有给头文件fies sys / types.h和unistd.h,仍然没有显示任何错误 .
有人可以回答我的问题吗?
2 回答
使用
pid_t
表示源代码可移植到例如使用64位PID的系统 .进程按此顺序执行,因为这是调度程序决定执行它们的方式 .
这里pid_t是64位unsigned int,你可以在头文件中找到它 . 这基本上用于使程序可移植 .
为什么父进程先行?
答案:1 . 在分叉进程之后,子进程必须复制父进程的内存布局(复制头部,堆栈,初始化数据,未初始化数据),因此父进程无关,所以在大多数情况下,父进程必须先执行 .
但在少数情况下,当子项首先执行时,仅在父级调度时间到期时 .
在UNIX系统/ proc / sys / kernel / sched_runs_first中,将此值设为1以确保子进程首先运行 .
在结论中,此行为未定义且不明确,最好使用任何同步方法 .