gpt4 book ai didi

c - 如何使守护进程的子进程在 Linux 中交互?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:40:15 31 4
gpt4 key购买 nike

我想从守护进程中生成一个交互式进程。我怎样才能做到这一点?我尝试了以下代码片段:

int main (int argc, char *argv[])
{
if (fork()) exit (EXIT_FAILURE) ;
freopen("/dev/null","w",stderr) ;
freopen("/dev/null","r",stdin) ;
freopen("/dev/null","w",stdout) ;
/*
*/
if (fork()) exit (EXIT_FAILURE) ;
pid_t shell_pgrp = getpgrp () ;
pid_t my_pid = getpid () ;
int shell_tty = isatty (fileno(stderr)) ?
dup (fileno(stderr)) : open (ctermid(NULL), O_RDWR|O_NONBLOCK) ;
shell_tty = fcntl (shell_tty,F_DUPFD,10) ;
fcntl (shell_tty,F_SETFD,FD_CLOEXEC) ;
if (shell_tty < 0) exit (EXIT_FAILURE) ;
if ((shell_pgrp = tcgetpgrp (shell_tty)) != getpgrp()) {
setpgid (my_pid,shell_pgrp) ;
}
if (shell_pgrp < 0) exit (EXIT_FAILURE) ;
if ((shell_pgrp = tcgetpgrp (shell_tty)) == getpgrp()) {
signal (SIGTTIN,SIG_IGN) ;
signal (SIGTTOU,SIG_IGN) ;
signal (SIGTSTP,SIG_IGN) ;
signal (SIGHUP ,SIG_IGN) ;
signal (SIGQUIT,SIG_IGN) ;
signal (SIGQUIT,SIG_IGN) ;
if (!tcsetpgrp (shell_tty,shell_pgrp)) {
argv++ ;
if (execv(argv[0],argv) < 0) {
exit (EXIT_FAILURE) ;
}
}
}
}

最佳答案

我自己从未尝试过,但我不认为复制标准文件描述符将起作用。我相信您生成的进程需要获得一个新的控制终端。 This API 可能会对您有所帮助。

关于c - 如何使守护进程的子进程在 Linux 中交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6491490/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com