2010-08-19 179 views
0

我有一個c問題,任何人都可以幫助我。我用c語言編寫了一個進程創建代碼,它使用fork()調用pid &。 fork調用現在可以用來製作子進程,任何機構都可以告訴我如何製作父進程?我知道在創建一個孩子的過程中自動創建父進程,但我想從一開始就讓父進程,所以任何人都可以告訴我如何做到這一點, 其次,我只是創建過程,我不知道如何使用它我不能分配任何工作(計算)給它,任何人都可以告訴我如何使用該過程的工作?c語言問題

第三個我想給我的過程命名我該怎麼做&我怎麼能控制他們的執行? 如果有人能夠賜教,請幫我理解這一切。 我應該感謝全力爲這個永遠 由於事先

+0

您能否通過創建「父進程」來解釋您的意思? – 2010-08-19 09:34:09

+0

如果你有一個子進程,那麼「父進程」這個術語是唯一有意義的。那麼,在創建一個孩子之前:它是什麼意思?是一個「父過程」? – Dirk 2010-08-19 09:42:35

+0

創建子進程稱爲父進程。 – 2010-08-19 10:27:46

回答

0
Secondly i just create the process i don't know how to use it i cant assign any 
work(computation) to it 

您需要使用fork和exec使它運行您要執行的程序。 這是wiki link欲瞭解更多信息。

Fork-exec is a commonly used technique in Unix whereby an executing process spawns a new program. fork() is the name of the system call that the parent process uses to "divide" itself ("fork") into two identical processes. After calling fork(), the created child process is actually an exact copy of the parent - which would probably be of limited use - so it replaces itself with another process using the system call exec().

0
  1. 要創建一個父進程,把你的代碼創建一個孩子和反向父母和孩子的角色。 Presto change-o,新進程是父進程,舊進程是孩子。

  2. 對於進程之間的通信,請使用pipe(2)或幾個。另外,還有shared memory

  3. 要控制執行,請使用kill(2)wait(2)。我不確定分配名稱,我們可能需要知道您的平臺。

1

當你fork一個進程時,一個進程變成兩個進程。每個繼續在完全相同的地方運行。唯一的區別是fork將子進程的PID返回給父進程,並將值0返回給子進程。

沒有任何幫助,子進程不知道它的父進程。如果兩個進程需要相互通信,那麼他們將需要使用某種IPC機制。

IPC的常見形式是pipe。如果在分叉之前打開管道,則子代和父代都保留打開的文件描述符。這將允許兩個進程相互通信。如果需要,家長現在可以自由地將其PID傳達給子流程。

+2

將父pid傳遞給孩子的最簡單方法是在派生前將pid保存到變量中。孩子也可以使用系統調用'getppid()' – JeremyP 2010-08-19 11:01:24

+0

應該有這個想法。只是我很厚 – doron 2010-08-19 11:30:09

4

叉呼叫創建了一個新的過程,是相同的,除了一些微小差異現有工藝如它的PID,PID父。原始進程從完全相同的地方進行,並且這個父進程。這意味着你的問題基本上沒有意義。您不會創建父進程,原創進程一旦創建子進程就會成爲父進程。

這有點像問「我通過懷孕和分娩創造了一個孩子,但我如何創造父母?」您自動成爲家長。

回到電腦...

當你叉,系統調用返回子的PID給父0到孩子,所以你應該有代碼是這樣的:

int pid = fork(); 
if (pid == 0) 
{ 
    // in child, do child processing - normally exec an executable 
} 
else if (pid > 0) 
{ 
    // in parent, do some processing - often wait for child to complete 
} 
else 
{ 
    // fork failed - handle the error 
} 
0

有關重命名(我假設你的意思的名字顯示爲ps),以「重命名」一個過程,只需將您的新名稱複製到argv[0]