[英]Set fork()'s child into foreground, and exit parent
我正在嘗試更改Linux中進程的PID。 然后的想法是使用fork()產生一個子代,並將終端的控制權交給該子代,然后從父代退出。 結果將是具有新進程PID的新進程,而不會中斷執行流程。
我已經對以下PoC進行了編碼,但是它不起作用。 如果我不在父級上使用wait(),則子級進程不會控制終端。 我的意思是,它繼續輸出,但stdin未附加到孩子,而是bash擁有的。
#include <string.h>
#include <stdio.h>
#include <asm/ptrace.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <linux/sched.h>
#include <stdlib.h>
#include <signal.h>
int main(void) {
int i = 0, ret = 0;
pid_t pid = 0;
printf("PID = %d\n", getpid());
pid = fork();
if (pid == -1) {
return -1;
}
if (pid != 0) {
printf("Parent PGID = %d\n", getpgid(0));
printf("Parent PGID for 0 = %d\n", tcgetpgrp(0));
signal(SIGTTOU, SIG_IGN);
for (i = 0; i < 3; i++) {
ret = tcsetpgrp(i, pid);
}
exit(0);
}
setpgid(0, 0);
printf("Child PGID = %d\n", getpgid(0));
printf("Child PGID for 0 = %d\n", tcgetpgrp(0));
for (i = 0; 1; i++) {
printf("iter = %d, PID = %d\n", i, getpid());
usleep(300000);
}
return 0;
}
提前致謝。
神奇的是,以下代碼創建了一個新的PID,在ps中只有1個進程。 它在前景中。 問題是,當我按CTRL + C時,它還沒有完成。 它繼續迭代。 所以我想bash沒有收到信號。 我該如何解決?
#include <string.h>
#include <stdio.h>
#include <asm/ptrace.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <linux/sched.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/wait.h>
int main(void) {
int i = 0, ret = 0;
pid_t pid = 0;
printf("PID = %d\n", getpid());
pid = fork();
if (pid == -1) {
return -1;
}
if (pid != 0) {
ret = tcsetpgrp(0, pid);
wait(NULL);
}
setpgid(0, 0);
for (i = 0; 1; i++) {
printf("iter = %d, PID = %d\n", i, getpid());
usleep(300000);
}
return 0;
}
編輯:那是一個錯誤。 因為我按了CTRL + C,所以它只出現1個進程,而父進程繼續。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.