簡體   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