Я создаю фоновые процессы в C, используя fork().Фоновый процесс выходит быстрее, чем я могу добавить его pid для управления
Когда я создал один из этих процессов, я добавляю его pid в массив, чтобы я мог отслеживать фоновые процессы.
pid = fork();
if(pid == -1)
{
printf("error: fork()\n");
}
else if(pid == 0)
{
execvp(*args, args);
exit(0);
}
else
{
// add process to tracking array
addBGroundProcess(pid, args[0]);
}
У меня есть обработчик для пожинают зомби
void childHandler(int signum)
{
pid_t pid;
int status;
/* loop as long as there are children to process */
while (1) {
/* get zombie pids */
pid = waitpid(-1, &status, WNOHANG);
if (pid == -1)
{
if (errno == EINTR)
{
continue;
}
break;
}
else if (pid == 0)
{
break;
}
/* Remove this child from tracking array */
if (pid != mainPid)
cleanUpChild(pid);
}
}
Когда я создаю фоновый процесс, обработчик выполняется и пытается очистить ребенка, прежде чем я могу даже сделать вызов addBGroundProcess.
Я использую команды, такие как emacs &, которые не должны выходить немедленно.
Что мне не хватает?
Спасибо.
Чтобы быть ясным, вы говорите, что, поскольку я вызвал emacs & (с &), что Unix породит другого ребенка, чтобы выполнить фоновый процесс emacs, тем самым, заставив созданного мной ребенка умереть и поднять флаг SIGCHLD? –
Ах .. Я пропустил «&». Казалось бы, это вероятная причина второй вилки. Хотя более конкретно, я думаю, что «&» может вызвать порождение оболочки, которая выполняет emacs и сразу же выходит. Имейте в виду, что это не в моей голове, поэтому я еще не сделал много, чтобы проверить это. –
Если я не запускаю emacs & и вместо этого запускаю emacs, emacs открывается в текущем сеансе терминала. Это поведение я не хочу. Я действительно хочу выполнить команду (emacs, ls и т. Д.) В фоновом режиме и отслеживать эти процессы и очищать зомби по мере их возникновения. –