Мне нужно перенести C-программу из OpenVMS в Linux и теперь испытывать трудности с программными производными подпроцессами. Создается подпроцесс (fork отлично работает), но execve сбой (что верно, поскольку указано неправильное имя программы).C-program не возвращается из wait-statement
Но чтобы сбросить количество активных подпроцессов, я вызываю потом wait(), который не возвращается. Когда я смотрю на процесс через 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
{
...
}
}
}
Это что-то, что нужно сделать, чтобы сообщить команде wait, что больше нет подпроцессов? С OpenVMS программа отлично работает.
спасибо заранее за вашу помощь
Если (как вы говорите в комментариях к ответам), вы изменили 'vfork' на' fork' и все еще получаете проблему, я бы сказал, что, скорее всего, вы неверно истолковываете то, что происходит. Попробуйте уменьшить это до минимального, полного, компилируемого, проверяемого примера (http://stackoverflow.com/help/MCVE). – davmac