Process 需要帮助掌握有关fork()的一些概念

Process 需要帮助掌握有关fork()的一些概念,process,fork,Process,Fork,关于fork(),我有几个问题: 1) 我很确定forking允许多个线程访问一个共享地址空间,这对系统来说非常便宜。我还非常确定每个进程都分配了堆栈空间。另外,我不相信调用fork()创建了一个新的进程映像(据我所知,它是使用exec()创建的),我的这些断言对吗 2) 现在有一个非常复杂的问题:在进程上调用fork()是否等同于多线程?像fork()父进程一样,父进程和子进程是否有自己的线程 3) 如果fork()复制父进程,子进程如何知道何时停止fork?即,您有以下简单代码: #incl

关于fork(),我有几个问题:

1) 我很确定forking允许多个线程访问一个共享地址空间,这对系统来说非常便宜。我还非常确定每个进程都分配了堆栈空间。另外,我不相信调用fork()创建了一个新的进程映像(据我所知,它是使用exec()创建的),我的这些断言对吗

2) 现在有一个非常复杂的问题:在进程上调用fork()是否等同于多线程?像fork()父进程一样,父进程和子进程是否有自己的线程

3) 如果fork()复制父进程,子进程如何知道何时停止fork?即,您有以下简单代码:

#include
int glob=6;
char buf[]="a write to stdout\n";
main()
{
   int var;
   int pid;
   var=88;
   printf("Before Fork\n");
   if((pid=fork())<0)
       printf("fork Error\n");
   else if(pid==0)
   {
       glob++;
       var++;
   } 
   else
       printf("\nPID= %d ,GLOB = %d,VAR = %d\n",getpid(),glob,var);
   exit(0);
}
#包括
int-glob=6;
char buf[]=“写入标准输出\n”;
main()
{
int-var;
int-pid;
var=88;
printf(“Fork\n之前”);
简而言之,如果((pid=fork()):

  • 分叉不允许分叉进程(其子进程)更改父进程数据。分叉新进程后,它将获得父进程描述符(其数据、文件描述符等)的副本.Forking并不便宜。由于涉及复制,它实际上是一个非常昂贵的操作。Forking进程是其父进程的副本,堆栈也是一个副本。
    exec()
    “only”加载并执行新代码,因为您所指的“进程映像”已在fork期间创建

  • 分叉父进程会创建一个子进程。父进程可以有线程,子进程也可以有线程。父进程的线程不能与子进程的线程干涉。在双核cpu上,一个核可以运行父进程,而另一个核可以并行运行子进程。如果父进程进程有一个线程在运行,那么一个内核可以运行父进程,而另一个内核可以并行运行父进程的线程

  • 阅读一本书或查找一些教程。在做任何其他事情之前,了解fork系统调用时发生的情况应该非常清楚。一个简单的谷歌搜索将为您提供丰富的信息,例如以下内容

  • 简言之:

  • 分叉不允许分叉进程(其子进程)更改父进程数据。分叉新进程后,它将获得父进程描述符(其数据、文件描述符等)的副本.Forking并不便宜。由于涉及复制,它实际上是一个非常昂贵的操作。Forking进程是其父进程的副本,堆栈也是一个副本。
    exec()
    “only”加载并执行新代码,因为您所指的“进程映像”已在fork期间创建

  • 分叉父进程会创建一个子进程。父进程可以有线程,子进程也可以有线程。父进程的线程不能与子进程的线程干涉。在双核cpu上,一个核可以运行父进程,而另一个核可以并行运行子进程。如果父进程进程有一个线程在运行,那么一个内核可以运行父进程,而另一个内核可以并行运行父进程的线程

  • 阅读一本书或查找一些教程。在做任何其他事情之前,了解fork系统调用时发生的情况应该非常清楚。一个简单的谷歌搜索将为您提供丰富的信息,例如以下内容