C linux中的fork()系统调用

C linux中的fork()系统调用,c,linux,unix,operating-system,fork,C,Linux,Unix,Operating System,Fork,我对fork()系统调用有一些愚蠢的怀疑, 如果有人能回答这些问题,我们将不胜感激 fork()系统调用是否返回整数?如果是,那么为什么 执行fork()系统调用,我们在pid\t中获取它的值 我们不能只写intx=fork() 例如- #include<stdio.h> #include<sys/types.h> #include<unistd.h> int main() { pid_t pid; pid=fork(); if(pid==0) {

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

  • fork()系统调用是否返回整数?如果是,那么为什么
    执行fork()系统调用,我们在pid\t中获取它的值 我们不能只写intx=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");
}
}
#包括
#包括
#包括
int main()
{  
pid_t pid;
pid=fork();
如果(pid==0)
{
printf(“子进程”);
}
否则,如果(pid>0)
{
printf(“母流程”);
}
其他的
{
printf(“无法创建”);
}
}
  • 为什么我们要执行pid=fork()而不是int x=fork()
  • 上面的程序给出了一个输出父进程child进程 首先执行的是父进程,而不是子进程
我试过这个密码-

   #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");
        }
    }
#包括
int main()
{
int x;
x=fork();
如果(x==0)
{
printf(“子进程”);
}
如果(x>0),则为else
{
printf(“母流程”);
}
其他的
{
printf(“无法创建”);
}
}
  • 我尝试在整数变量中收集fork()的值 在ubuntu 15.04的gcc编译器中,其工作正常,未显示 如果出现任何错误并给出与上述程序相同的结果,则 给
  • 是编译器的问题还是这段代码没问题? 即使我没有给出sys/types.h和unistd.h的标题,仍然没有 显示任何错误
谁能
请回答我的问题?

使用
pid\t
意味着源代码可以移植到使用64位pid的系统


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

这里的pid是64位无符号整数,您可以在头文件中找到它。这基本上用于使程序可移植

为什么要先处理父进程

答复: 1.分支进程后,子进程必须复制父进程的内存布局(复制头、堆栈、初始化数据、未初始化数据),这样时间父进程就无事可做,所以在大多数情况下,父进程必须首先执行

  • 但在少数情况下,只有在父调度时间到期时,子进程才首先执行

  • 在UNIX系统/proc/sys/kernel/sched_中,首先运行_,将此值设为1以确保子进程首先运行


  • 总之,此行为未定义且未定义,最好使用任何同步方法。

    您是否阅读过的文档多次?你读过一本很好的Linux或POSIX编程书吗?请参阅您应该使用的参考,因为I/O是缓冲的,您应该使用
    gcc-Wall-Wextra-g
    @BasileStarynkevitch编译。如果我先键入错误的代码,然后键入正确的代码,是否需要缓冲?因为我第一次尝试了错误的代码。您应该阅读更多。。。我不能花几个小时来解释几本好书中写了什么。请注意,
    fork
    对于新手来说很难理解(因此花数小时和数天的时间理解它是正常的)。顺便说一句,请参见wikipage,不要首先怀疑编译器或实现。质疑你自己的代码。