繁体   English   中英

使用fork()的单词频率

[英]Frequency of word using 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. 您正在使用strstr ,它将做您自己的程序应该做的事情。 您是否应该循环遍历以下字符并将它们与模式进行比较?
  2. 您的程序实际上是按顺序运行的,因为您正在wait()子进程在启动子进程后立即完成。 您是否不应该将所有子PID都存储在某个数组中,仅在所有子PID开始等待之后才存储?
  3. 您的父进程永远不会在子进程中看到verificare的返回值,因为您的main进程将忽略它并始终返回0。也许使用exit从子进程中返回?
  4. 您的程序无法向用户报告是否找到匹配项。

我了解这是一项家庭作业,您不应按照他们的要求去做。 但是请注意,这不是fork很好用法。 子字符串的出现可以用单个处理器在时间上线性地检查要搜索的字符串的长度(使用有限自动机)。 因此,这种并行算法在这里并不能真正为您带来任何收益。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM