我必须将 C 程序从 OpenVMS 迁移到 Linux,并且现在在生成子进程的程序方面遇到了困难。生成了一个子进程(fork 工作正常),但 execve 失败(这是正确的,因为给出了错误的程序名称)。
但是为了重置活动子进程的数量,我随后调用了一个不返回的 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
{
...
}
}
}
是否必须做任何事情来告诉等待命令没有更多的子进程?使用 OpenVMS,该程序可以正常工作。
非常感谢您的帮助