我试图用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; }
可能的input可以是任何东西,例如
SsWd asdas qwmkfd aw.
上面的algorithm应该只是修改小写字母,并保持原样。
我希望有人能够帮助我。
另外,我只实施了凯撒密码。
编辑:我添加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);
这可能不是唯一的问题,但会解释seg故障。
原因是自我解释!