我试图重新编写一个shell,我想改变用我的shell启动的程序的pgid!
我尝试在fork()
之后执行不同的功能:
setpgid(0, 0)
使得像vim,emacs等交互式程序进行无限循环setsid()
并不值得对终端进行控制。它使
像emacs这样的程序因Could not open file: /dev/tty
tcsetpgrp(0, getpid())
让我的shell转到后台!#include <unistd.h> #include <stdlib.h> #include <stdio.h> int main(void) { int pid; if ((pid = fork()) == 0) { setpgid(0, 0); execlp("/usr/bin/emacs", "", "-nw", "test_file", (char*)0); } if (pid < 0) exit (1); if (pid > 0) { printf("Program finished.\n"); waitpid(-1, 0, 0); } return (0); }
你有解决方法吗?
答案 0 :(得分:0)
所以,我找到了像emacs,vim等工作emacs程序的解决方案,需要控制终端!
我必须将控制权添加到父节点中,如下所示:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int pid;
if ((pid = fork()) == 0)
{
setpgid(0, 0);
execlp("/usr/bin/emacs", "", "-nw", "test_file", (char*)0);
}
if (pid < 0)
exit (1);
if (pid > 0)
{
tcsetpgrp(0, pid)
printf("Program finished.\n");
waitpid(-1, 0, 0);
}
return (0);
}
如果您想了解更多信息:这是一个很好的链接http://www.gnu.org/software/libc/manual/html_node/Launching-Jobs.html