[英]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.