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: