Использование переменной с функцией popen - PullRequest
0 голосов
/ 25 апреля 2020

Я хочу написать код, в котором пользователь вводит данное слово, и я ищу его в файле, используя cat | grep, поэтому моя функция popen() должна включать переменную.

вот мой текущий код:

void *catgrep(void * param){
    int *sock = (int*) param;
    int new_sock = *sock;

int fd[2];
pipe(fd);
pid_t pid = fork(); 
char word[30];
recv(new_sock, word ,30, 0); //receiving the word to search for from the client
char command[]="grep -w ";
strcat(command, word);

     if(pid==0){
       close(1);
       dup(fd[1]);
       close(fd[0]);
       close(fd[1]);

    char *cat_args[] = {"/bin/cat", "file.txt", NULL};
    execv(cat_args[0], cat_args);
    exit(0);
}

  if(pid > 0){
    close(0);
    dup(fd[0]);
    close (fd[1]);
    close(fd[0]);

    FILE *fp2;
    if ((fp2 = popen(command, "r")) == NULL) {
        perror("popen failed");
        return NULL;
    }

    size_t str_size = 1024;
    char *stringts2 = malloc(str_size);
    if (!stringts2) {
        perror("stringts allocation failed");
         return NULL;
    }

    stringts2[0] = '\0';
    char buf[128];
    size_t n;
    while ((n = fread(buf, 1, sizeof(buf) - 1, fp2)) > 0) {
        buf[n] = '\0';
        size_t capacity = str_size - strlen(stringts2) - 1;
      while (n > capacity) {
            str_size *= 2;
            stringts2 = realloc(stringts2, str_size);
            if (!stringts2) {
                perror("stringts realloation failed");
                 return NULL;
            }
            capacity = str_size - strlen(stringts2) - 1;
        }
        strcat(stringts2, buf);
    }

    if (pclose(fp2) != 0) {
        perror("pclose failed");
         return NULL;
    }
    if(send(new_sock, stringts2, 10000, 0)<0){
       printf("Error in send! %s\n", strerror(errno));
        return NULL; 
    }
}
  return NULL;

Как вы видите, я сейчас пытаюсь сделать всю команду одной строкой и использовать ее в popen(), что приводит к Illegal instruction: 4 во время компиляции, какие-либо предложения о том, что я могу сделать, чтобы достичь этого?

1 Ответ

0 голосов
/ 25 апреля 2020

По крайней мере, проблема с strcat. Как сказано в документации:

Функция strcat () должна добавить копию строки, на которую указывает s2 (включая завершающий нулевой байт), в конец строки, на которую указывает s1.

Но вы не выделили достаточно места, связанного с command, чтобы иметь возможность сцеплять больше символов, и вам не следует пытаться добавлять символы в строковые литералы (это запрещено). Тогда это неопределенное поведение .

Чтобы заставить его работать в базовых c случаях, вы можете сделать что-то вроде:

char command[1024];
sprintf(command,"%s %s","grep -w",word);

Обратите внимание, что это не будет работать, если ваш word слишком длинный или содержит пробелы.

...