я создаю ловушку после получения для моего репозитория развертывания.
Хук компилирует и выполняет мою программу. Программа выводит несколько строк, которые я хотел бы видеть, разветвляется и продолжается только в разветвленном процессе.
Когда я запускаю программу с 2>&1 1>/dev/null &
он работает нормально, хотя я не вижу никакого выхода из этого. Я пробовал звонить setsid()
после fork, но затем git commit не останавливается, он продолжает выводить выходные данные программы.
Есть идеи для решения?
Когда вы разветвляете свою программу; оба они имеют доступ к потоку 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 к чему-либо.
Других решений пока нет …