2017-02-23 72 views
-1

我對C中的系統編程非常新,我在看clone()的手冊頁,它有一堆標誌。它也給你一個例子:C系統編程克隆()標誌位值和操作

pid = clone(childFunc, stackTop, CLONE_NEWUTS | SIGCHLD, argv[1]); 

第一個問題,我通過man頁面查找的clone(),它不會給你的旗幟任何數值,但它確實提到「標誌也可能按零或更多以下常量按位或置零「。我在哪裏可以找到這些標誌的數字值。

其次,什麼是語句

CLONE_NEWUTS | SIGCHLD 

什麼是真正發生在這裏背後的邏輯是什麼?我知道按位OR,但它對這些標誌有什麼作用?ORing這兩個標誌的結果是什麼?

+0

我不明白爲什麼downvote? –

回答

1

第一個問題:

請參閱系統的對CLONE_NEWUTS 「sched.h中」(可能是0x04000000),以及 「signal.h中」 爲SIGCHLD(可能20)。如果你看一下「sched.h中」您可能會發現信號掩碼(CSIGNAL)設置爲0x000000FF,其送入問題2 ...

第二個問題:

從Linux手冊頁(man7.org):

如果CLONE_NEWUTS設置,然後創建一個新的UTS 命名空間,其標識由調用進程的UTS命名空間複製 標識符初始化過程。 如果未設置此標誌,則(與fork(2)一樣),在與調用進程相同的UTS名稱空間中創建的進程爲 。 該標誌旨在用於實現容器。

而且

標誌的低字節包含在孩子去世發送到父終止信號的數量。如果此信號被指定爲除SIGCHLD以外的任何其他信號,則父級進程在等待等待(2)的孩子時必須指定__WALL或__WCLONE選項。如果沒有指定信號,那麼父進程在孩子終止時不發送信號。

我會建議這樣做 - 在新的UTS命名空間中創建克隆的進程,並在SIGCHLD終止後通知父進程。