使用fork()的单词频率

时间:2014-12-07 23:07:08

标签: c string substring fork

我有以下程序而且我已经陷入困境了。(程序不会创建更多的子进程,只有一个。有人可以帮助我吗?

  

编写一个程序,将字符串的出现次数计算为子字符串   另一个字符串(两个字符串作为命令的参数给出   线)。每次检查第一个字符串是否显示为子字符串   从一个职位开始,检查将由子进程完成   (用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;
}

1 个答案:

答案 0 :(得分:3)

  1. 您正在使用strstr,这将完成您自己的程序应该完成的任务。你不应该循环遍历以下字符并将它们与模式进行比较吗?
  2. 您的程序基本上是顺序运行的,因为您{child}启动子程序后立即完成子程序。难道你不能将所有子PID存储在一些数组中并且只有在所有子项开始后才开始等待吗?
  3. 您的父进程永远不会在子进程中看到wait()的返回值,因为您的verificare会忽略它并且始终返回0.也许使用main从子进程返回?< / LI>
  4. 您的程序无法向用户报告是否找到匹配项。
  5. 我知道这是一项家庭作业,你不应该按照他们的要求做不同的事情。但请注意,这不是exit的良好用法。可以使用单个处理器以字符串的长度线性检查子串的出现以进行搜索(使用有限自动机)。所以这个并行算法在这里并没有真正为你买任何东西。