2014-11-23 39 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