Как отсоединиться от терминала, чтобы завершить работу после получения в git - PullRequest
0 голосов
/ 02 мая 2018

Я создаю ловушку после получения для моего репозитория развертывания. Хук компилирует и выполняет мою программу. Программа выводит несколько строк, которые я хотел бы видеть, разветвляется и продолжается только в разветвленном процессе. Когда я запускаю программу с 2>&1 1>/dev/null &, она работает нормально, хотя я не вижу никакого вывода из этого. Я попытался вызвать setsid() после fork, но затем git commit не останавливается, он продолжает выводить вывод программы.

Есть идеи для решения?

1 Ответ

0 голосов
/ 02 мая 2018

Когда вы разветвляете свою программу; оба они имеют доступ к потоку stdout / err; который git hook, скорее всего, ожидает закрытия.

Чтобы решить вашу проблему; Если ваш разветвленный процесс, который продолжается, закрывает свой дескриптор для stdout, stderr и stdin;

close(fileno(stdin));
close(fileno(stdout));
close(fileno(stderr));

, так же как и начало нового сеанса setsid() (что вы и сделали), он станет полностью оторванным процессом от вашего скоро ставшего мертвым процесса.

Обратите внимание, что попытка вывести что-либо впоследствии будет неопределенным поведением, если оставить его как есть.

Если вы хотите продолжать использовать только cout или cerr в этом процессе, я бы посоветовал вам перенаправить его, используя rdbuf, как вы могли в тот момент после разветвления, перенаправить stdout и stderr на /dev/null

Если вы хотите использовать printf или любое из его семейства, то вам придется заново привязать дескриптор файла stdout к чему-либо.

...