簡體   English   中英

C語言中fork()的父級和子級

[英]Parent and child of fork() in C

由於每個過程都在做自己的事情,對我來說,這更像是“兄弟/姐妹”關系。 將它們稱為父進程和子進程有什么特定的原因嗎?

而且,父進程始終在子進程之前運行是否正確?

父級擁有進程組,因此產生並收獲子級。 通常,此過程需要一點點管理工作,而孩子則充當同伴和兄弟姐妹。

不過,命名只是約定,用於描述哪個進程產生了另一個進程。

父進程和子進程根據您的代碼執行工作,但不是由於父子關系。 當您在主線程中執行fork()時,它將創建一個子進程,這里的fork返回一個在父進程和子進程中不同的值,該值可用於區分父子進程的工作。 fork()在父進程中始終返回子進程的pid,在子進程中始終返回0。

關於您的第二個問題,一旦fork()被調用,它總是取決於調度程序,並且我們無法預測在fork()函數調用之后哪個進程首先運行。

將它們稱為父進程和子進程有什么特定的原因嗎?

好吧,由於它是一個進程(父進程)創建了第二個進程(子進程),因此可能是命名的原因。

而且,父進程始終在子進程之前運行是否正確?

簡短的答案。 不。 我在我的所有C代碼中都一直在使用它

pid_t pid = fork();
  if(pid == 0){ // child     
    // Child stuff
  }else{ // parent
    // Parent stuff
}

您可能還想使用

waitpid(pid, NULL, 0);

fork()創建當前流程的副本,該副本是流程控制組的一部分。 新進程從屬於原始進程,例如,當進程死亡時,將SIGCHLD發送給父進程。 同樣,該克隆是一個劣等副本:例如,任何存儲的getpid()結果在子代中都不准確; 子代具有不同的parentid ,子代具有父代文件描述符的副本 ,並且具有獨立的資源使用計數器。

因此,父進程始終是對fork()進行調用的進程,如果那是您首先要運行的意思。 如果您的意思是“調度程序將始終首先提供父進程分片”,那么答案是否定的。

參見: http : //gauss.ececs.uc.edu/Courses/c694/lectures/ForksThreads/forks.html,http : //linux.die.net/man/2/fork

#include <stdio.h>
#include <unistd.h>

int main(int argc, const char* argv[])
{
    pid_t otherPid;

    printf("parent pid = %u\n", getpid());

    otherPid = fork();
    // in the parent, otherPid = the child's (new) process ID
    // in the child, otherPid = 0.

    switch (otherPid) {
        case -1:
            printf("Fork failed: %d\n", errno);
            return errno;
        break;
        case 0: // child
            sleep(2);
            printf("child: my pid is %u\n", getpid());
        break;
        default:
            printf("parent: pid is %u, child should have %u\n", getpid(), otherPid);
            sleep(3);
        break;
    }

    return 0;
}

父母總是比孩子先。 排序和甜美!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM