2016-02-08 49 views
0

在父進程退出vfork後,是否可以「跳回」子進程?
比方說,我有這個簡單的應用:分叉父進程退出後跳回到子進程

#include <iostream> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

using namespace std; 

int main (void) 
{ 
    pid_t cpid = vfork(); 

    if (cpid < 0) cout << "error with fork\n"; 

    else if (cpid == 0) 
    { 
     cout << "cin from child: "; 
     int a = 0; 
     cin >> a; 
     exit (0); 
    } 

    else 
    { 
     cout << "cin from parent: "; 

     int a, status; 

     waitpid (cpid, &status, WNOHANG); 

     cin >> a; 
    } 

    return 0; 
} 

有了這個代碼,我需要給孩子中第一個輸入數字。
之後,我需要在家長中輸入一個數字。
而之後,我想孩子再次出現,
所以這可能嗎?

回答

0

我真的不知道你想描述什麼「之後,我想孩子再次出現」,但我想你想執行代碼的子部分?

在聯機幫助頁的vfork你可以找到:

的vfork()從叉(2)在調用線程被掛起,直到子終止(或者通常,通過調用_exit(2),或異常的不同,在發出致命信號之後),或者致電execve(2)。在那之前,孩子與父母共享所有內存,包括堆棧。孩子不得從當前函數返回或調用exit(3),但可以調用_exit(2)。

由於您退出子進程,您必須分叉一個新子進程或調用子進程的exec並修改代碼,以便子進程只運行它。

+0

你明白正確,我想重新運行子進程內的代碼。問題是......我的應用程序需要將uid切換到進程。如果我將uid usind setuid切換爲0(#root),我可以將id切換爲默認用戶而沒有任何問題,但是我無法切換回默認用戶(Linux)無法設置uid。這就是爲什麼我會退出父母並回到與uid 0(孩子用作守護進程)運行的孩子, – user1533754