繁体   English   中英

将fork()的子级设置为前台,然后退出父级

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM