Вывести процесс на передний план - PullRequest
2 голосов
/ 07 марта 2012

У меня есть процесс (который читает и пишет в тип терминала), который был выполнен фоновым процессом. Я могу видеть это, используя пс. Пытаясь вывести его на передний план, я попытался:

int main()

{

    FILE* fd = popen("pidof my_program","r");

    // ...
    // Some code to get the pid of my_program as mpid
    //...

    printf("pid of my_program is %d",mpid);
    signal(SIGTTOU, SIG_IGN);
    setpgid(mpid,0); // Set program group id to pid of process
    tcsetpgrp(0,mpid); // Give it terminal stdin access
    tcsetpgrp(1,mpid); // Give it terminal stdout access
    return 0;
}

Это не работает, хотя. Может ли кто-нибудь помочь мне в этом? Спасибо.

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

Вы можете сделать это «мягким» способом, вызвав команду оболочки fg и передав ей pid (рекомендуется).

Если вы хотите закодировать это, вот как fg / bg кодируется в bash (не надо):

static int
fg_bg (list, foreground)
     WORD_LIST *list;
     int foreground;
{
  sigset_t set, oset;
  int job, status, old_async_pid;
  JOB *j;

  BLOCK_CHILD (set, oset);
  job = get_job_spec (list);

  if (INVALID_JOB (job))
    {
      if (job != DUP_JOB)
    sh_badjob (list ? list->word->word : _("current"));

      goto failure;
    }

  j = get_job_by_jid (job);
  /* Or if j->pgrp == shell_pgrp. */
  if (IS_JOBCONTROL (job) == 0)
    {
      builtin_error (_("job %d started without job control"), job + 1);
      goto failure;
    }

  if (foreground == 0)
    {
      old_async_pid = last_asynchronous_pid;
      last_asynchronous_pid = j->pgrp;  /* As per Posix.2 5.4.2 */
    }

  status = start_job (job, foreground);

  if (status >= 0)
    {
    /* win: */
      UNBLOCK_CHILD (oset);
      return (foreground ? status : EXECUTION_SUCCESS);
    }
  else
    {
      if (foreground == 0)
    last_asynchronous_pid = old_async_pid;

    failure:
      UNBLOCK_CHILD (oset);
      return (EXECUTION_FAILURE);
    }
}
0 голосов
/ 07 марта 2012

Если у вас есть процесс, который находится в фоновом режиме или приостановлен, вы можете переместить его на передний план с помощью команды fg.По умолчанию процесс, последний раз приостановленный или перемещенный в фоновый режим, перемещается на передний план.Вы также можете указать, какой pid он использует, чтобы сделать его приоритетным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...