linux多進程的總結(fork用法)

簡單理解爲,一個進程表示的,就是一個可執行程序的一次執行過程中的一個狀態。操作系統對進程的管理,典型的情況,是通過進程表完成的。進程表中的每一個表項,記錄的是當前操作系統中一個進程的情況。對於單 CPU的情況而言,每一特定時刻只有一個進程佔用 CPU,但是系統中可能同時存在多個活動的(等待執行或繼續執行的)進程。

    fork()用於從已存進程中建立一個新進程,新進程爲子進程,老進程爲父進程.可以通過檢查"fork()"地返回值知道哪個是子進程哪個是父進程。父進程得到的返回值是子進程的進程號,而子進程則返回0。 網管網bitsCN_com

    基本模式是:

    #include
    #include
    #include
    #include
    #include
    #include
    main()
    {
    pid_t pid;
    int rv;
    pid=fork(); //創建進程
    switch(pid)
    {
    case -1: //返回-1的話,進程創建沒成功
    perror("fork");
    exit(1);
    case 0:
    printf(" CHILD: This is the child process!\n");
    printf(" CHILD: My PID is %d\n", getpid()); //調用 getpid 得到自己的 PID
    printf(" CHILD: My parent's PID is %d\n", getppid()); //getppid() 得到父進程的 PID
    printf(" CHILD: Enter my exit status (make it small): ");
    scanf(" %d", &rv);
    printf(" CHILD: I'm outta here!\n");
    exit(rv);


    default:
    printf("PARENT: This is the parent process!\n");
    printf("PARENT: My PID is %d\n", getpid());
    printf("PARENT: My child's PID is %d\n", pid); //fork() 返回的default值意味着你正在父進程中,返回值是子進程的 PID 。這是得到子進程 PID 的唯一方法
    printf("PARENT: I'm now waiting for my child to exit()...\n");
    wait(&rv); //父進程必須等待子進程完成收拾子進程的殘餘後才能繼續
    printf("PARENT: My child's exit status is: %d\n", WEXITSTATUS(rv)); 也就是父進程不能先於子進程消亡。
    printf("PARENT: I'm outta here!\n");
    }
    }
    //EXITSTATUS() 是一個宏,從 wait() 返回值中提取實際的返回值。
    // wait() 怎麼知道在哪個進程上等待?我的意思是,由於父進程可以有多個子進程, wait() 實際等待地是哪一個?答案非常簡單,它等待最先退出的那一個。你可以通過以子進程的 PID 爲參數調用 waitpid() 指明是哪一個子進程。

    if (!fork())
    {
    printf("I'm the child!\n");
    exit(0);
    } else
    {
    printf("I'm the parent!\n");
    wait(NULL);
    }

    linux 是多用戶和多進程的操作系統,進程在操作系統中的創建,都會生成一個進程描述塊,描述當前進程的所有信息,包括,數據段、代碼段、堆棧段的地址,當前進程的環境變量,文件描述符等。

    fork函數過程:操作系統先創建一個進程描述塊,然後把父進程的所有進程描述符的信息精確拷貝過來,和父進程一樣(除了進程ID不一樣外),代碼段共享,數據段和堆棧段複製,所有的寄存器的值全部精確拷貝,文件描述符也許精確拷貝。

    fork的返回值,fork在父進程空間中返回子進程的PID,在子進程空間中返回0。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章