C 系统编程:Fork()
我已经为涉及fork的问题提供了代码。然而,我很难找出该计划的几个关键部分。问题是,如果命令行 这是不正确的。从命令行初始化pr_limit。pr_limit变量指定一次允许执行的最大子级数。pr_count变量保存活动子级数。将其初始化为0。执行以下主循环,直到标准输入到达文件末尾:如果pr_计数是pr_限制,则等待子循环完成并减少pr_计数。从标准输入(fgets)中读取一行最多包含MAX_BUF个字符的数据,并通过分叉一个子项执行与该命令行对应的程序并执行该文件。递增pr_count以跟踪活动子项的数量。检查是否有任何子项已完成(**)。已完成的每个子级的递减pr_计数。在标准输入中遇到文件结尾后,等待所有剩余的子项完成 然后退出。对于每个终止的子级,打印其退出代码值 我在实现上遇到困难的部分包括从标准文件中读取命令行,并通过分叉执行与命令行对应的程序。以及跟踪活跃的孩子,并检查孩子是否已经完成。对系统编程来说还是相当新的C 系统编程:Fork(),c,fork,C,Fork,我已经为涉及fork的问题提供了代码。然而,我很难找出该计划的几个关键部分。问题是,如果命令行 这是不正确的。从命令行初始化pr_limit。pr_limit变量指定一次允许执行的最大子级数。pr_count变量保存活动子级数。将其初始化为0。执行以下主循环,直到标准输入到达文件末尾:如果pr_计数是pr_限制,则等待子循环完成并减少pr_计数。从标准输入(fgets)中读取一行最多包含MAX_BUF个字符的数据,并通过分叉一个子项执行与该命令行对应的程序并执行该文件。递增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;
}
intmain(intargc,char*argv[])
{
文件*文件;
file=fopen(“testsim.c”、“r+”);
pid_t childpid;
childpid=fork();
int len=0;
char*line=NULL;
read=getline(&line,&len,文件);
MAX_BUF=读取;
char buf[MAX_buf];
int i,pr_极限;
int pr_计数=0;
如果(argc!=2)
{
fprintf(stderr,“用法:%s进程\n”,argv[0]);
返回1;
}
if(childpid==0)
{
而(!feof(文件))
{
if(pr\U计数==pr\U限制)
{
等待(-1,&状态,WNOHANG);
pr_计数--;
}
其他的
{
fgets(buf,MAX_buf,文件);
}
pr_limit=atoi(argv[1]);
对于(i=0;i if((childpid=fork())Readif(argc!=2)
-您不应该在fork之前这样做吗?如果两个进程都没有通过该条件(如果被触发,并且都退出),那么启动另一个进程似乎毫无意义。@WhozCraig我以为我在if(argc!=2)之后调用了fork,是不是做得不正确??