gpt4 book ai didi

c - Linux——内存映射文件

转载 作者:太空宇宙 更新时间:2023-11-04 11:15:35 25 4
gpt4 key购买 nike

我正在尝试使用 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 后段错误消失了。但是要知道我对修改后的小写字母有奇怪的问号。有谁知道为什么?

最佳答案

如果你也想写入文件,那么

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);

这可能不是唯一的问题,但可以解释段错误。

原因不言自明!

关于c - Linux——内存映射文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21269176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com