SIGCHLD и fork + waitpid () в библиотеке - PullRequest
0 голосов
/ 20 сентября 2018

Я пишу библиотеку, которая использует fork() и exec() для запуска внешних программ.Код в моей библиотеке работает как отдельный поток.Поток библиотеки должен waitpid() на разветвленном процессе знать код завершения дочернего процесса.

К сожалению, если приложение, использующее мою библиотеку, зарегистрирует обработчик сигнала для SIGCHLD, вызовы waitpid() вернутсяс ошибкой ECHILD.

Как мне справиться с этим как с библиотекой, при которой приложение оказывает минимальное влияние?По сути, я хочу, чтобы ребенок оставался зомби и контролировал, когда его пожинают.

Могу ли я изолировать себя от того, что приложение решает делать?Могу ли я каким-то образом перехватить обработчик сигнала и вернуть его после того, как мой waitpid будет сделан?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Вы можете сделать так же, как system:

system () выполняет команду, указанную в команде, путем вызова команды / bin / sh -c и возвращает послекоманда была выполненаВо время выполнения команды SIGCHLD будет заблокирован , а SIGINT и SIGQUIT будут игнорироваться.

Контур может быть

pid_t pid;
sigset_t block, backup;

sigemptyset(&block);
sigaddset(&block, SIGCHLD);

sigprocmask(SIG_BLOCK, &block, &backup);

if ((pid = fork()) < 0) {
    // error handle
} else if (pid == 0) {    // child
    sigprocmask(SIG_SETMASK, &backup, NULL);

    // ...
} else {
    // waitpid

    sigprocmask(SIG_SETMASK, &backup, NULL);
}

// ...
0 голосов
/ 21 сентября 2018

Освобождение ресурсов, выделенных библиотекой, является ошибкой приложения.Это в принципе так же, как если бы приложение делало что-то вроде free(yourlib_create_context(...)), хотя, конечно, последствия менее серьезны.Нет причин пытаться поддерживать этот тип бессмысленного поведения приложения;просто документируйте, что это недопустимо.

Если вы хотите "защитить" от такого рода программной ошибки, маска сигнализирует о вызове abort, если waitpid завершается неудачно с ECHLD.Это безусловно прекратит процесс, и у заявителя не будет возможности его поймать.

...