簡體   English   中英

如何將參數傳遞給fork()創建的進程

[英]How to pass arguments to processes created by fork()

我想在C中使用fork()創建進程的副本。我無法弄清楚如何將參數傳遞給我的進程的副本。 例如,我想將一個整數傳遞給進程副本。

或者我該怎么做,如果我有一個循環,我調用fork()並希望將一個唯一值傳遞給進程(例如0 ... N)

for (int i = 0; i < 4; ++i) {
    fork();
    // pass a unique value to new processes.
}

關於fork() myvar是你自動生成的每個進程都會得到父進程的所有內容的副本,例如,假設我們想要將一個int myvar傳遞給兩個子進程中的每一個,但是我希望每個進程都有一個不同的來自父進程的值:

int main()
{
    int myvar = 0;
    if(fork())
        myvar = 1;
    else if(fork())
        myvar = 2;
    else
        myvar = 3;

    printf("I'm %d: myvar is %d\n", getpid(), myvar);
    return 0;
}

這樣做可以讓每個進程都擁有myvar的“副本”和它自己的值。

I'm 8517: myvar is 1
I'm 8518: myvar is 2
I'm 8521: myvar is 3

如果您沒有更改該值,則每個fork'd進程將具有相同的值。

本地和全局變量在fork()中固有地保留,因此不需要“傳遞參數”。 如果您在分叉過程中調用函數,則可以執行以下操作:

pid_t pid = fork();
if (pid == 0) {
    funcToCallInChild(argument);
    exit(0);
}

我遲到了回應,但這是我如何做到的:

const char *progname = "./yourProgName";
const char *argument1 = "arg1";
const char *argument2 = "arg2";

if (fork() == 0)
{
    // We are the child process, so replace the process with a new executable.  
    execl(progname, progname, argument1, argument2, (char *)NULL);
}
//  The parent process continues from here.

首先,fork()進程以創建新進程。 它仍然具有與舊存儲空間相同的存儲空間。 fork()返回父進程和子進程。 如果fork()返回零,那么您就是子進程。 然后子進程使用execl()將進程內存替換為新文件中的進程內存。

請注意,對execl()給出了兩次progname。 第一個是execl()實際上會嘗試運行,第二個是argv [0]。 您必須提供兩者,否則參數計數將被關閉。 Progname必須包含所有必需的路徑信息才能找到所需的可執行映像。

我在這個例子中給出了兩個參數,但你可以傳遞任意多個參數。 它必須以NULL結束,我認為你必須像我展示的那樣將其轉換為(char *)。

這種方法為您提供了一個完全獨立的過程,包含參數和唯一的pid。 它可以在父進程終止后繼續運行很長時間,也可以在父進程終止之前終止。

請參閱exec()函數系列。

編輯:如果您嘗試初始化與基本過程相同的程序的副本,只需繼續使用duskwuff建議的變量。

您可以使用clone() (fork()本身實際使用)。 它允許您將arg傳遞給您的輸入功能。

http://linux.die.net/man/2/clone

暫無
暫無

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

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