Мне нужно перенести C-программу с OpenVMS на Linux, и теперь у меня проблемы с программой, генерирующей подпроцессы. Генерируется подпроцесс (fork работает нормально), но execve не работает (что правильно, так как указано неправильное имя программы).
Но чтобы сбросить количество активных подпроцессов, я впоследствии вызываю ожидание (), которое не возвращается. Когда я смотрю на процесс через ps, я вижу, что подпроцессов больше нет, но wait() не возвращает ECHILD, как я думал.
while (jobs_to_be_done)
{
if (running_process_cnt < max_process_cnt)
{
if ((pid = vfork()) == 0)
{
params[0] = param1 ;
params[1] = NULL ;
if ((cstatus = execv(command, params)) == -1)
{
perror("Child - Exec failed") ; // this happens
exit(EXIT_FAILURE) ;
}
}
else if (pid < 0)
{
printf("\nMain - Child process failed") ;
}
else
{
running_process_cnt++ ;
}
}
else // no more free process slot, wait
{
if ((pid = wait(&cstatus)) == -1) // does not return from this statement
{
if (errno != ECHILD)
{
perror("Main: Wait failed") ;
}
anz_sub = 0 ;
}
else
{
...
}
}
}
Нужно ли что-то сделать, чтобы сообщить команде ожидания, что подпроцессов больше нет? С OpenVMS программа работает нормально.
Заранее большое спасибо за вашу помощь
vfork
наfork
и все еще получаете проблему, я бы сказал, что, скорее всего, вы неверно истолковываете происходящее. Попробуйте сократить его до минимального, полного, компилируемого и проверяемого примера (stackoverflow.com/help/MCVE). - person davmac   schedule 21.07.2015