[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Амперснад в bash



On 2016-01-18, Иван Лох wrote:

>> на деле же вывод процесса не скрывается. управление терминалом
>> возвращается, но вывод запущенной команды продолжает сыпаться в
>> терминал.
>
> Отсоединить процесс от терминала можно так
> nohup proc&

Дополню из nohup(1):

   If standard input is a terminal, redirect it from /dev/null.

   If standard output is a terminal, append output to 'nohup.out' if possible,
   '$HOME/nohup.out' otherwise.

   If standard error is a terminal, redirect it to standard output. To save
   output to FILE, use 'nohup COMMAND > FILE'.

Далее сделаю предположение что дескрипторы stdin, stdout, stderr копируются
между приложениями с вызовом execve(2):

  By default, file descriptors remain open across an execve().

И потому выставляются в зависимости от того что сконструировал getty / sshd
(снова предположение).

Единственное не ясно как libc / ld.so / kernel связывает сохраненные
дескрипторы с stdin/stdout...

Я видел такой код для изменения stdin:

   int new_stdin = open("/path/to/file, O_RDONLY);
   pid_t fk = fork();
   if (!fk) { // in the child
       dup2(new_stdin, 0);
       close(new_stdin);
       execl("program_name", "program_name", NULL);
       exit(127);
   } else if (fk < 0) {
        // in parent with error from fork
   } else {
       // in parent with no error so fk = pid of child
   }
   close(new_stdin); // we don't need this anymore

Или список дескрипторов - просто копируется execl + stdin/stdout/stderr имеют
предопределенные номера, потому понятно где их искать?

-- 
http://defun.work/


Reply to: