2014-11-23 68 views
0

我嘗試使用execvp創建一個作爲參數給出的存儲庫。但我得到了一些段錯誤(核心轉儲),我不能在下面的代碼解決: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 2014-11-23 22:21:33

+0

@OldProgrammar否 – 2014-11-23 22:28:07

回答

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]'。 – 2014-11-24 06:19:28