2015-10-29 17 views
0

我想打電話fork()與標誌CLONE_PARENT,但是,我不能找到一個方法來做到這一點。如何使用標誌或克隆()沒有第一個參數fn調用fork()?

clone()在大多數情況下可能是一個很好的選擇,但我想在信號處理程序中調用fork(),並在信號處理程序完成後返回到上一個流程。

我可以改變內核,因此任何解決方案需要的內核修改就可以了。

我試圖直接調用syscall clone,但我不知道如何在用戶空間中獲得struct pt_regs

回答

0

只需使用clone。雖然forksyscall依然存在,下glibc新版本中,fork庫調用只是一個鏈接別名clone一些特殊的參數

對於什麼[好,大部分東西]你沒有,你可以通過NULL

這裏有一個小片段,開始從:

#define ARCH_FORK() \ 
    INLINE_SYSCALL (clone, 4,             \ 
        CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD, 0,  \ 
        NULL, &THREAD_SELF->tid) 
+0

我跟蹤你所引用的代碼,我覺得彙編代碼做的事情,比如'系統調用(__ NR_clone,CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD,0,NULL,&THREAD_SELF- > TID)'。我測試了上面的代碼,但是,在調用'getpid()'時,子進程和父進程都獲得了父進程的PID。如果我改用'fork()','getpid()'返回正確的子進程的PID。 – oryxfea

+0

'syscall clone'事實上需要5個參數。上面的錯誤結果是否由於缺少參數「pt_regs」造成的? – oryxfea

+0

@oryxfea你只需要嘗試一下。克隆系統調用的glibc包裝採用不同的參數,並可能需要4-6個參數。克隆系統調用本身需要5個參數。當你建立時,找出你最喜歡的是哪一個。看看克隆手冊頁,它將詳細描述差異。對於raw,您可能必須指定原型或使用系統調用(...)。包裝不使用pt_regs ARCH_FORK使用原始系統調用。請參閱sysdeps/nptl/fork.c和__libc_fork。請注意,它不僅僅是克隆。 –

相關問題