2013-04-18 40 views
0

实施rm命令这里是一块其编译正常但在运行时是给分割故障代码。 有人可以告诉我如何解决这个问题。代码实现RM系统调用C.分段故障在linux

#include<sys/stat.h> 
#include<unistd.h> 
#include<dirent.h> 
#include<error.h> 
#include <stdio.h> 
#include <string.h> 


int rmq(char*pth) 
{ 
    char path[1000]; //hold the file name to be removed 
    strcpy(path,pth); 
    char *b; // stores the complete path of the file to be removed 
    struct dirent *d; 
    DIR *dir; 

    char cwd[256]; //holds current working directory 
    getcwd(cwd, sizeof(cwd)); 
    dir = opendir(cwd); 
    char path1[1000]; //for recursively moving through dir and subdir 
    strcpy(path1,cwd); 

    char newp[1000]; 
    struct stat buf; 

    while((d = readdir(dir))) //if there are directories to be read 
    { 
    if(!strcmp(d->d_name,".") || !strcmp(d->d_name,"..")) // skip "." and ".." 
    continue; 

    //appends directory read to cwd 

    strcpy(newp,path1); 
    strcat(newp,"/"); 
    strcat(newp,d->d_name); 
    //printf("%s>>",d->d_name); 

    if(stat(newp,&buf)==-1) // puts file info in buf 
     perror("stat"); 
    if(S_ISDIR(buf.st_mode))// if directory, then add a "/" to current path 
    { 
    //if a directory then call function again(recursion) 
     strcat(path1,"/"); 
     strcat(path1,d->d_name); 
     rmq(path1); 
    } 
    else{ 
     //if directory current read is the one to be removed 
     if((strcmp(path, d->d_name)) == 0){ 
     // append it with cwd & put it in b 
     b = malloc(25 + strlen(d->d_name) + 1); 
     sprintf(b, "%s/%s", "/home/urwa/Documents/OPS", d->d_name); 
     remove(b); // remove that file 
     free(b); 
     } 
    } 
} 
return 0; 
} 


int main(){ 
    char cwd[256]; 
    getcwd(cwd, sizeof(cwd)); 

    char *argv[2]; 
    argv[1] = "dumbledore.txt"; 
    rmq(argv[1]); // file to be removed is passed as parameter 
    return 0; 
} 

我想malloc的,但它并没有解决问题

+2

火了GDB并找出它的失败行:http://www.cs.cmu.edu/~gilpin/tutorial/ – paulsm4

+1

,请注意编译器警告。如果你有警告,你的代码不会*编译好。 –

+2

你试图'sprintf'到'B',这是一个'char',你想到了什么事情发生呢? – Blindy

回答

6

你应该与-Wall -Wextra标志代码编译绝对从编译器的帮助下更好的效益。在这里,你的代码,你会得到以下警告:

test.c: In function ‘rmq’: 
test.c:9:4: warning: implicit declaration of function ‘strcpy’ [-Wimplicit-function-declaration] 
test.c:9:4: warning: incompatible implicit declaration of built-in function ‘strcpy’ [enabled by default] 
test.c:25:3: warning: suggest parentheses around assignment used as truth value [-Wparentheses] 
test.c:26:3: warning: implicit declaration of function ‘strcmp’ [-Wimplicit-function-declaration] 
test.c:30:5: warning: implicit declaration of function ‘strcat’ [-Wimplicit-function-declaration] 
test.c:30:5: warning: incompatible implicit declaration of built-in function ‘strcat’ [enabled by default] 
test.c:34:5: warning: implicit declaration of function ‘perror’ [-Wimplicit-function-declaration] 
test.c:43:5: warning: implicit declaration of function ‘sprintf’ [-Wimplicit-function-declaration] 
test.c:43:5: warning: incompatible implicit declaration of built-in function ‘sprintf’ [enabled by default] 
test.c:43:5: warning: passing argument 1 of ‘sprintf’ makes pointer from integer without a cast [enabled by default] 
test.c:43:5: note: expected ‘char *’ but argument is of type ‘char’ 
test.c:44:5: warning: implicit declaration of function ‘remove’ [-Wimplicit-function-declaration] 
test.c: In function ‘main’: 
test.c:58:2: warning: control reaches end of non-void function [-Wreturn-type] 
test.c: In function ‘rmq’: 
test.c:43:12: warning: ‘b’ may be used uninitialized in this function [-Wuninitialized] 

因此,解决所有问题的最好办法就是要做到以下几点:

  • 首先,缺少包括:

    #include <stdio.h> 
    #include <string.h> 
    
  • 在while测试中(编译器需要确保您知道您在做什么)在作业周围添加额外的括号:

  • 您需要的char b;转变为char *b;和分配/解除分配必要的内存来存储字符串:

    if((strcmp(path, d->d_name)) == 0){ 
        b = malloc(25 + strlen(d->d_name) + 1); 
        sprintf(b, "%s/%s", "/home/urwa/Documents/OPS", d->d_name); 
        remove(b); 
        free(b); 
    } 
    
  • 然后,你需要添加return 0main功能,以以匹配您定义的签名。

一旦你完成了所有这些,仍然有一个错误,因为你错过了几个例子。尝试使用gdb和/或valgrind修复它(想想编译时设置-g选项)。

+0

很好的答案。这导致了学习。 –

+0

@perror所以我改进了你提到的代码。但它仍然给分段错误。 – urwaCFC

+1

@ user128806:出现该段错误,因为你是用一个无限循环(您呼叫'连连rmq')饱和堆栈。你必须学习,如果你想在C – perror