我提供了涉及fork的问题的代码。但是,我很难找到该计划的几个关键部分。问题告诉我检查适当的命令行参数并在命令行输出用法消息 是不正确的。从命令行初始化pr_limit。 pr_limit变量指定允许一次执行的最大子节点数.pr_count变量保存活动子节点的数量。将其初始化为0.执行以下主循环,直到在标准输入上到达文件结尾:如果pr_count是pr_limit,则等待子进程完成并减少pr_count。从最高MAX_BUF字符的标准输入(fgets)读取一行,并通过分配子项并执行该文件来执行与该命令行对应的程序。增加pr_count以跟踪活动子节点的数量。检查是否有任何孩子已经完成(**)。减少已完成的每个孩子的pr_count。在标准输入上遇到文件结束后,等待所有剩余的孩子完成 然后退出对于每个已终止的子项,打印出其退出代码值。
我在执行时遇到的部分涉及从标准文件读取行并通过分叉执行与命令行对应的程序。以及跟踪活跃的孩子并检查孩子是否已经完成。系统编程还是一个新手。
int main (int argc, char *argv[])
{
FILE *file;
file = fopen("testsim.c", "r+");
pid_t childpid;
childpid = fork();
int len = 0;
char *line = NULL;
read = getline(&line, &len, file);
MAX_BUF = read;
char buf[MAX_BUF];
int i, pr_limit;
int pr_count = 0;
if (argc != 2)
{
fprintf(stderr, "Usage: %s processes\n", argv[0]);
return 1;
}
if (childpid == 0)
{
while (!feof(file))
{
if (pr_count == pr_limit)
{
wait(-1, &status, WNOHANG);
pr_count--;
}
else
{
fgets(buf, MAX_BUF, file);
}
pr_limit = atoi(argv[1]);
for (i = 0; i < pr_limit; i++)
{
if ((childpid = fork()) <= 0)
break;
}
fprintf(stderr, "i: %d process ID: %ld parent ID: %ld child ID: %ld\n", i, getpid(), getppid(), childpid);
}
}
if (pid < 0)
{
perror("Error: \n");
return EXIT_FAILURE;
}
return 0;
}