0
我想打電話fork()
與標誌CLONE_PARENT
,但是,我不能找到一個方法來做到這一點。如何使用標誌或克隆()沒有第一個參數fn調用fork()?
clone()
在大多數情況下可能是一個很好的選擇,但我想在信號處理程序中調用fork()
,並在信號處理程序完成後返回到上一個流程。
我可以改變內核,因此任何解決方案需要的內核修改就可以了。
我試圖直接調用syscall clone
,但我不知道如何在用戶空間中獲得struct pt_regs
。
我跟蹤你所引用的代碼,我覺得彙編代碼做的事情,比如'系統調用(__ NR_clone,CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD,0,NULL,&THREAD_SELF- > TID)'。我測試了上面的代碼,但是,在調用'getpid()'時,子進程和父進程都獲得了父進程的PID。如果我改用'fork()','getpid()'返回正確的子進程的PID。 – oryxfea
'syscall clone'事實上需要5個參數。上面的錯誤結果是否由於缺少參數「pt_regs」造成的? – oryxfea
@oryxfea你只需要嘗試一下。克隆系統調用的glibc包裝採用不同的參數,並可能需要4-6個參數。克隆系統調用本身需要5個參數。當你建立時,找出你最喜歡的是哪一個。看看克隆手冊頁,它將詳細描述差異。對於raw,您可能必須指定原型或使用系統調用(...)。包裝不使用pt_regs ARCH_FORK使用原始系統調用。請參閱sysdeps/nptl/fork.c和__libc_fork。請注意,它不僅僅是克隆。 –