setpgid使交互式程序(vim,emacs ... ncurses?)成为无限循环

时间:2015-04-27 14:35:55

标签: c linux shell

我试图重新编写一个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);
}

你有解决方法吗?

1 个答案:

答案 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