簡體   English   中英

Linux-內存映射文件

[英]Linux - Memory Mapped File

我正在嘗試使用mmap實施凱撒密碼。 我認為密碼工作得很好,但問題是mmap。 它的想法是如果有更改,則更新文件。 到目前為止,它不起作用。 我可以讀取並映射內存映射文件。 但是,如果我進行任何修改,都會遇到分割錯誤。 不幸的是,我自己無法解決問題。 因此,如果您能幫助我,我將不勝感激。

這是代碼。

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

    if(argc != 5)
       fprintf(stdeer, "usage: ./cipher (encrypt|decrypt) <file name> (casar| vigenere) <key>\n");

    // (encrypt / decrypt) can be found in argv[1]
    // filename in argv[2]
    // encryption method in argv[3]
    // key in argv[4]
    int fd = open(argv[2], O_RDWR, S_IWRITE | S_IREAD);
    if (fd < 0)
        hanle_error("open");

    off_t len = lseek(fd, 0, SEEK_END);
    if (len == (off_t)-1)
        handle_error("lseek");

    unsigned char* data = mmap(0, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); // Add PROT_WRITE
    if (data == MAP_FAILED)
        handle_error("mmap");

    char c = *argv[4];
    int key = 0;

    if(strcmp(argv[3], "caesar") == 0) {
        key = c - 48;
        if(strcmp(argv[1], "decrpyt") == 0)
            key = -key;
        int num = 0;
        for(int size_t i = 0; i < (size_t)len; i++) {
            if(data[i] >= 97 && data[i] <= 122) {
                num = data[i];
                num +=key;
                if(num > 'z') {
                    num -= 26;
                    data[i] = num + '0';
                } else if (num < 'a') {
                    num += 26;
                    data[i] = num + '0';
                } else {
                    data[i] = num + '0';
                }
            } else {
                continue;
            }
        }
    }

    return 0;
}

可能的輸入可以是任何東西,例如

SsWd asdas
qwmkfd aw.

上面的算法應該只修改小寫字母,其余部分保持原樣。

我希望有人可以幫助我。

另外,我只實現了凱撒密碼。

編輯:我添加PROT_WRITE后,seg錯誤消失了。 但是知道我對修改后的小寫字母有奇怪的問號。 有人知道為什么嗎?

如果您也要寫入文件,則

unsigned char* data = mmap(0, len, PROT_READ, MAP_SHARED, fd, 0);

應該

unsigned char* data = mmap(0, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

那可能不是唯一的問題,但可以解釋段錯誤。

原因是不言自明的!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM