操作系统fork函数

2019-08-26  本文已影响0人  王王王王王景

1、fork函数简介

参考:https://www.jianshu.com/p/484af1700176

#include <stdio.h>
#include <unistd.h> // (windows没有unistd.h)
int main()
{
    pid_t fpid;
    int count = 0;
    fpid = fork();
    
    if(fpid < 0) {
        printf("error in fork\n");
    } else if(fpid == 0) {
        // 表示子进程
        printf("son process\n");
        ++count;
    } else {
        // > 0表示父进程
        printf("father process\n");
        ++count;
    }
    printf("fpid = %d , count = %d\n", fpid, count);
    return 0;
}

(macos + xcode)运行结果是:

father process
fpid = 13915 , count = 1
son process
fpid = 0 , count = 1

其实就相当于链表,进程形成了链表,父进程的fpid(p 意味point)指向子进程的进程id, 因为子进程没有子进程,所以其fpid为0.

fork出错可能有两种原因:

fork()产生的子进程不是从#include处开始复制代码的,这是因为fork是把进程当前的情况拷贝一份,执行fork时,进程已经执行完了int count=0;fork只拷贝下一个要执行的代码到新的进程。

2、fork进阶知识

#include <unistd.h>  
#include <stdio.h>  
int main(void)  
{  
   int i=0;  
   printf("i son/pa ppid pid  fpid/n");  
   //ppid指当前进程的父进程pid  
   //pid指当前进程的pid,  
   //fpid指fork返回给当前进程的值  
   for(i=0;i<2;i++){  
       pid_t fpid=fork();  
       if(fpid==0)  
           printf("%d child  %4d %4d %4d/n",i,getppid(),getpid(),fpid);  
       else  
           printf("%d parent %4d %4d %4d/n",i,getppid(),getpid(),fpid);  
   }  
   return 0;  
}  

运行结果:

  i son/pa ppid pid  fpid
 0 parent 2043 3224 3225
 0 child  3224 3225    0
 1 parent 2043 3224 3226
 1 parent 3224 3225 3227
 1 child     1 3227    0
 1 child     1 3226    0

这份代码比较有意思,我们来认真分析一下:

上一篇 下一篇

猜你喜欢

热点阅读