我正在尝试创建一个从文件中获取文本的程序,之后,它会告诉我该文本是否包含我想要搜索的字符串。我的想法是我必须用一个进程和多个线程来做所有事情。它是一个可变数字的线程数(我应该告诉终端我想要多少线程)。例如,如果我想要4个线程,文件中的文本将被分成4个字符串,每个线程将使用自己的字符串,并在该字符串中搜索我想要找到的单词。
为了验证自己一切正常,我试图在屏幕上打印一些变量(在server.c中)。在这里我遇到了一个问题,我无法弄明白。即使我告诉程序在屏幕上打印“init”变量,它也不会打印任何内容。打印尺寸,打印nr_thr,当我说打印“init”时,一切都可以,直到我到达零件。很明显,整个程序都没有用。
我该如何解决? 这个程序的想法没问题好吗?
这是server.c
###########Server.c##########
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <pthread.h>
struct argum{
char string[100];
char cautat[100];
};
void *cautare(void *data){
int rez;
printf("AM ajuns in thread");
struct argum *argum = data;
int i,j,k;
if (strstr(argum->string,argum->cautat)){
printf("Exista in string");
rez=1;
}
else{
printf("Nu exista in string asa ceva");
rez=0;
}
return (void*)rez;
}
int main(int argc, char**argv){
struct argum *argum = malloc(sizeof(struct argum));
char buffer[1000];
int nr_thr;
int df1;
ssize_t in, out;
int init=0;
int i;
char *a[100];
char b[1000];
nr_thr=atoi(argv[3]);
printf("\n Nr threaduri:%d \n",nr_thr);
df1 = open(argv[1], O_RDWR);
if (df1 == -1){
perror("eroare deschidere ");
//exit(1);
}
int size=lseek(df1, 0, SEEK_END);
printf("\nSize:%d\n",size);
lseek(df1, 0, SEEK_SET);
for(i=0; i<=size; i++){
if((lseek(df1, i, SEEK_SET))==-1){
perror("Eroare in fisier");
}
in=read(df1,&buffer[i],1);
}
printf("In fisier este textul:");
puts(buffer);
init = size/nr_thr;
printf("\nInitial: %d ",init);
int k=0;
int l=0;
int j;
while(init<=size){
for(i=init; i<=size/nr_thr; i++){
b[k]=buffer[i];
k++;
}
a[l]=b;
init=size/nr_thr;
if(nr_thr>0){
nr_thr--;
l++;
}
k=0;
}
int rezultat;
int *return_vals = malloc(nr_thr * sizeof(int));
pthread_t threads[10];
for(i=0; i<nr_thr; ++i){
puts(a[i]);
argum->string[100]= *a[i];
argum->cautat[100]= *argv[2];
pthread_create(&threads[i],NULL,cautare,argum);
}
for(i=0; i<nr_thr; ++i){
rezultat=pthread_join(threads[i],(void**) &return_vals[i]);
}
for(i = 0; i < nr_thr; i++)
printf("Thread %d returned: %d\n", i, return_vals[i]);
exit(1);
}
这是client.c,我正在调用所有内容。
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>
int main(){
int id,d, stare;
int nr_thr;
char nume_fis[100], nume_cuv[100];
char thr[100];
d=1;
while(d==1){
printf("> ");
scanf("%s %s %d",nume_fis,nume_cuv,&nr_thr);
sprintf(thr,"%d",nr_thr);
id=fork();
if(id<0){
perror("Eroare la creare proces");
return -1;
}
else if(id==0){ //fiu
execl("./server","server",nume_fis,nume_cuv,thr,NULL);
perror("eroare la exec");
}
else{
wait(&stare);
if(WIFEXITED(stare)){
printf("%d",WEXITSTATUS(stare));
}
}
printf("\nContinuati?(1 pt da)");
scanf("%d",&d);
}
return 0;
}