2014-11-23 4 views
0

Я пытаюсь использовать execvp для создания репозитория, который задается как параметр. Но я получить Segfault (дампа памяти), что я не могу решить в следующем коде:Ошибка сегмента с execvp

#include <sys/stat.h> //mkdir 
#include <sys/types.h> 
#include <stdio.h> //perror 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#define MAX 10 

int main(int argc, char *argv[]) { 

int i; 
char *args[6] = {"tar","-xzvf", strcpy(args[2],argv[0]), "-C", "/home/bg/Desktop /Project/", NULL}; 
FILE *fp; 
char *line = (char *)malloc(sizeof(char)); 
char *result = (char *)malloc(sizeof(char)); 
size_t len = 0; 
ssize_t read; 
char* strings[MAX]; 


int result_code = mkdir("/home/bg/Desktop/Project/", 0777); 
umask(mask); 

if(result_code ==-1) { 
    perror(argv[0]); 
    printf("Erreur dans la création du répertoire/n"); 
    exit(EXIT_FAILURE); 
} 

if(result_code==0){ 

printf("Le répertoire a bien été crée \n"); 

execvp(*args,args); 

fp = fopen("/home/bg/Desktop/Project/meta", "r"); 
if (!fp) {perror("problème avec le fichier"); 
      fprintf(stderr, "Erreur dans l'ouverture du fichier\n"); 
      exit(EXIT_FAILURE); 
} 


while ((read = getline(&line, &len, fp)) != -1) { 
      printf("On récupère une ligne de taille %zu :\n", read); 
      printf("%s", line); 

      if(strchr (line,'#') != NULL) { 

      } 

      else if (strchr (line,'$') != NULL) { 
      strings[i] = strdup(line); 
      i++; 

      } 

      else if (strchr (line,'>') != NULL) { 
      result = strdup(line); 
      } 

     } 

unlink("meta"); 
free(line); 
free(result); 
exit(EXIT_SUCCESS); 

    } 


} 

Я пытался использовать символ ** но execvp не поместится. Спасибо за помощь.

+0

Это даже скомпилировать ?? – OldProgrammer

+0

@OldProgrammar no –

ответ

0

Я вижу проблему со следующим кодом:

char *args[6] = {"tar","-xzvf", strncpy(args[2],argv[0]), "-C", "/home/bg/Desktop /Project/", NULL}; 

В частности, с strncpy по двум причинам: 1) strncpy() принимает три аргумента, и вы только указанных 2, и 2) он пытаясь скопировать argv[0] (имя программы) в args[2], который представляет собой массив указателей, а не буфер, содержащий имя программы.

+0

Однако 'args [2]' не является массивом указателей '; это просто указатель, который еще не был инициализирован (это элемент инициализируется 'strncpy()'). Плохо. Инициализатор должен просто быть 'argv [0]', если имя программы желательно в этой точке списка аргументов. –

Смежные вопросы