У меня проблема с вилкой, которая возникает только эпизодически. Он работает в основном все время, но не каждый раз в тестовой системе.Linux, разветвленный процесс зависает сразу
Мое исследование не привлекло никого, кто упомянул об аналогичной проблеме.
Проблема возникает во встроенной системе Linux. Доступны разделы подкачки.
Выполнение процесса блокирует все сигналы во всех потоках и обрабатывает их через sigtimedwait в выделенном потоке.
Если я начинаю дочерний процесс с помощью вилки:
- Родительский процесс продолжается с возвращаемым значением> 0. Таким образом, вилка работает. Существует нет -1 возвращено - поэтому никаких ошибок, а не из памяти! Затем родитель ждет дочернего процесса и никогда не возвращается из ожидания.
- Детский процесс никогда ничего не делает наблюдаемый. Самое первое, что дочерний процесс должен сделать, пишет сообщение журнала. Это сообщение журнала никогда не появляется. Затем он должен порождать два ребенка: обрабатывает процесс тайм-аута и рабочий процесс. Эти процессы никогда не появляются.
- Если я проверил через ps в командной строке, я вижу существующий дочерний процесс. Он находится в состоянии S (Прерывающий сон (ожидание завершения события)). Он никогда не получает никакого процессорного времени, он не показывает использования ЦП.
- Если я убить -9 дочерний процесс, родительский процесс заканчивается, ожидая и продолжает счастливо.
Псевдо код, показывающий проблему:
const pid_t childPid = fork();
if(0 == childPid) {
// child process
LOG_MSG("Child process started."); // <- This never shows up in the syslog.
// do some stuff
} else if(-1 == childPid) {
// error
LOG_MSG("Parent process: Error starting child process!");
result = false;
} else {
// parent process
LOG_MSG("Parent process: Child process started. PID: %.", childPid); // <- This shows up in the syslog.
// do some stuff
int status = 0;
const int options = 0;
const auto waitResult = waitpid(childPid, &status, options);
// more stuff
}
Вопросы:
- Что может вызвать этот процесс ребенок висит?
- Что произойдет, если новый процесс закончится из памяти в вызове LOG_MSG, который приводит к syslog? Это поднимет сигнал (который не может быть доставлен, потому что он заблокирован)?
Родитель процесса не ждет acutally – hek2mgl
Каково определение 'LOG_MSG'? – PSkocik
Можете ли вы запустить свою программу с помощью «strace», используя опцию «-ff», чтобы следовать за forks? например «strace -o output.txt -ff your_program». Вы должны увидеть файл трассировки для родительского процесса и любого дочернего элемента, который он порождает. Информация в этих файлах может быть освещена. –