【发布时间】:2019-08-07 15:25:06
【问题描述】:
我试图使用fork 创建一个子进程,但它反复返回-1,我试图找到原因并得出以下结论:
Fork() will fail and no child process will be created if:
[EAGAIN] The system-imposed limit on the total number of pro-
cesses under execution would be exceeded. This limit
is configuration-dependent.
[EAGAIN] The system-imposed limit MAXUPRC (<sys/param.h>) on the
total number of processes under execution by a single
user would be exceeded.
[ENOMEM] There is insufficient swap space for the new process.
现在我不知道如何检查第一点和第三点,但查看点 MAXUPRC - 我查看了 sys/param.h:
//<sys/param.h>
#define MAXUPRC CHILD_MAX /* max simultaneous processes */
CHILD_MAX 已在此处提及(unistd.h):
//<unistd.h> - DEFINED IN MY SYSTEM
#define _SC_CHILD_MAX 2
CHILD_MAX - _SC_CHILD_MAX 每个用户 ID 的最大并发进程数。 不得小于 _POSIX_CHILD_MAX (25)。
现在我无法确定是否保持 _SC_CHILD_MAX 小于 25 是原因还是我必须调查第一个和第三个原因(它们很难检查为该系统是 Z/OS 访问受限,我对此不太了解)。
perror(""); 没有打印任何内容,errno 正在打印 655360。
#include<stdio.h>
#include<errno.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
long int prc_id;
prc_id=fork();
if(prc_id ==0)
calling_child();
else if(prc_id <0)
{
printf("errno - %d\n",errno);
printf("failed %d\n",prc_id);
exit(0);
}
return 0;
}
上面的代码运行良好,并在我自己的笔记本电脑(centos)上创建了一个子进程,但在开发环境中我想有一些限制。
calling_child 永远不会被调用,因为返回的 prc_id 是 -1(在进入函数时甚至不会打印第一条打印语句)。
【问题讨论】:
-
其他几点可能对您有所帮助。首先,所有 errno/errno2 值都在名为“z/OS UNIX 系统服务:消息和代码”的书中定义。如果您在遇到问题后立即使用“printf("Error %x/%x - %s", errno, __errno2(), strerror(errno))" 或类似的东西(请记住,许多库函数重置 errno,因此您需要在发生错误时立即引用它)。此外,由于我向您推荐的文档以十六进制列出了 errno,因此通常最好使用“%x”打印它们。
-
进程限制是并发运行的进程,而不是累积值。 “ps”命令告诉您正在运行什么,我从未见过配置少于 25 个进程/用户的 z/OS 系统。该设置来自 UNIX 服务配置文件 - 类似于 SYS1.PARMLIB(BPXPRM00)。其中,MAXPROCSYS(系统范围的进程限制)和 MAXPROCUSER(每个用户的最大进程数)是关键。如果需要,也可以逐个用户覆盖这些值。如果您有权访问 z/OS 操作员控制台,“D OMVS,LIMITS”命令将告诉您当前设置。