我有以下程序而且我已经陷入困境了。(程序不会创建更多的子进程,只有一个。有人可以帮助我吗?
编写一个程序,将字符串的出现次数计算为子字符串 另一个字符串(两个字符串作为命令的参数给出 线)。每次检查第一个字符串是否显示为子字符串 从一个职位开始,检查将由子进程完成 (用fork获得)和父进程没有期待的 子进程完成以从不同的方式开始搜索 位置 - 因此验证是并行进行的。每个孩子 进程返回0 =未检查(未显示为该子字符串 位置),1 =已经过验证。进行所有搜索后, 父进程有望完成所有子进程并聚集 他们的返回代码 - 将打印此值(是数字 次作为子串)。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
char *s1,*s2;
int verificare(char *s1, char *s2, int lungime)
{
pid_t pid;
int i,status;
for (i = 0; i < lungime; i++) {
pid = fork();
switch (pid) {
case -1:
return EXIT_FAILURE;
case 0:
if (strstr(s1, s2) != NULL)
return 1;
else
return 0;
_exit(0);
default:
waitpid(pid, &status, 0);
if (WIFEXITED(status))
printf("Child %d, Return code %d\n", pid,
WEXITSTATUS(status));
return status;
}
}
}
int main(int argc,char **argv){
if (argc!=3){
printf("Too less arg");
return 0;
}
s1=argv[1];
s2=argv[2];
verificare(s1,s2,strlen(s2));
return 0;
}
答案 0 :(得分:3)
strstr
,这将完成您自己的程序应该完成的任务。你不应该循环遍历以下字符并将它们与模式进行比较吗?wait()
的返回值,因为您的verificare
会忽略它并且始终返回0.也许使用main
从子进程返回?< / LI>
我知道这是一项家庭作业,你不应该按照他们的要求做不同的事情。但请注意,这不是exit
的良好用法。可以使用单个处理器以字符串的长度线性检查子串的出现以进行搜索(使用有限自动机)。所以这个并行算法在这里并没有真正为你买任何东西。