首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我会有分割错误?我正在使用stat、mmap、nftw和memcmp等

为什么我会有分割错误?我正在使用stat、mmap、nftw和memcmp等
EN

Stack Overflow用户
提问于 2013-04-02 04:12:50
回答 2查看 5.9K关注 0票数 1

这是我的密码。我假设这与指针的不当使用有关,或者我没有正确地映射和取消对内存的映射。

有人能给我提供一些关于这个问题的见解吗?

代码语言:javascript
复制
#define _XOPEN_SOURCE 500
#include <stdio.h>
#include <stdlib.h> 
#include <sys/mman.h>
#include <ftw.h>
#include <sys/stat.h>
#include <string.h>

int size;
int map1, map2;
void *tar, *temp;

int callback(const char *filename,
             const struct stat *sb2,
             int filetype,
             struct FTW *ftw)
{           
    printf("test");
    if(sb2->st_size == sb1->st_size){
        temp = mmap(NULL, sb2->st_size, PROT_NONE, 0, map2, 0);
        int cmp = memcmp(tar, temp, sb2->st_size);
        printf("%d\n", cmp);
        if(cmp == 0){
            printf("%s\n", filename);
        }  
        if(munmap(temp,sb2->st_size) == -1){
            fprintf(stderr, "Error in unmapping in callback function");
            exit(EXIT_FAILURE);
        }  
    }  

    return 0;   //continue to walk the tree
}  

int main(int argc, char *argv[])
{
    //check for correct arguments
    if (argc == 1 || argc > 3) {
        fprintf(stderr, "Syntax: %s filename dirname\n", argv[0]);
        exit(EXIT_FAILURE);
    }  


    //use stat to get size of filename
    struct stat sb1;
    if(stat(argv[1],&sb1) != 0){
        fprintf(stderr, "Error in stat().");
        exit(EXIT_FAILURE);
    }
    size = sb1.st_size;

    //fd = mmap filename
    tar = mmap(NULL,sb1->st_size, PROT_WRITE, MAP_SHARED, map1, 0);
    if(tar == 0){
        fprintf(stderr, "Main() mmap failed");
        exit(EXIT_FAILURE);
    }  


    //walk through the directory with callback function
    nftw(argv[2], callback, 20, 0);

    // use munmap to clear fd
    if (munmap(tar,sb1->st_size) == -1) {
        fprintf(stderr, "Error in unmapping");
        exit(EXIT_FAILURE);
    }  
}

编辑

现在,在使用stat函数之前,我声明了我的struct sb1。这样做之后,我又收到了一个分割错误。然后我注释掉我的nftw()调用,并打印出了size变量(这个变量有一个合理的数字,因此我相信这是可行的)。新的错误是:

取消映射时出错。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-02 04:15:47

你宣布:

代码语言:javascript
复制
struct stat *sb1;

你用:

代码语言:javascript
复制
stat(argv[1],sb1);

您会崩溃并刻录,因为sb1是一个空指针(因为变量是在文件范围内定义的,所以它是用0初始化的)。

您需要声明(在文件范围内):

代码语言:javascript
复制
struct stat sb1;

然后在main()中可以使用:

代码语言:javascript
复制
if (stat(argv[1], &sb1) != 0)
    ...oops...

您必须检查sb1的所有用法,以修复从指针到对象的状态更改,必要时添加&,必要时将->更改为.

mmap()示例

这是我编写的一个函数的温和编辑版本,它使用mmap()将文件映射到内存中:

代码语言:javascript
复制
/* Map named file into memory and validate that it is a MSG file */
static int msg_mapfile(const char *file)
{
    int         fd;
    void       *vp;
    struct stat sb;

    if (file == 0)
        return(MSG_NOMSGFILE);
    if ((fd = open(file, O_RDONLY, 0)) < 0)
        return(MSG_OPENFAIL);
    if (fstat(fd, &sb) != 0)
    {
        close(fd);
        return(MSG_STATFAIL);
    }
    vp = mmap(0, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
    close(fd);
    if (vp == MAP_FAILED)
        return(MSG_MMAPFAIL);

MSG_xxxx常量是适用于它所来自的程序的不同错误号。它只需要读取文件,因此就是PROT_READ;我认为您也可以这样做。

票数 4
EN

Stack Overflow用户

发布于 2013-04-02 04:59:17

代码语言:javascript
复制
if (argc == 1 || argc > 3) {
    fprintf(stderr, "Syntax: %s filename dirname\n", argv[0]);
    exit(EXIT_FAILURE);
}

/* ... */

nftw(argv[2], callback, 20, 0);

我看到了argv2为空的可能性。也许你的意思是:

代码语言:javascript
复制
if (argc != 3) {
    fprintf(stderr, "Syntax: %s filename dirname\n", argv[0]);
    exit(EXIT_FAILURE);
}

你在读哪本书?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15755937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档