我正在学习如何使用lseek在文件中创建漏洞。
这是我到目前为止编写的代码......
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <sys/stat.h>
#include <string.h>
int main()
{
int fd;
char name[20] = "Harry Potter";
// Creating a file
if( (fd = open( "book.txt", O_RDWR | O_CREAT , S_IWRITE | S_IREAD ) < 0 )) {
printf("\ncreat error");
}
// Seeking 100th byte, from the begining of the file
if ( lseek(fd, 100, SEEK_SET) == -1 ) {
if (errno != 0) {
perror("lseek");
}
}
// Writing to the 100th byte, thereby creating a hole
if( write(fd, name, sizeof(char)*strlen(name)) != sizeof(char)*strlen(name) ) {
if (errno != 0) {
perror("write");
}
}
// closing the file
if ( close(fd) == -1 ) {
if (errno != 0)
perror("close");
}
return 0;
}
当我编译并执行此代码时,我得到了一个lseek错误以及名称&#39; Harry Potter&#39;没有被插入文件。这是我执行上面代码时的输出:
lseek: Illegal seek
Harry Potter
我甚至试图捕捉所有错误。 请进一步帮助我。
答案 0 :(得分:3)
if( (fd = open( "book.txt", O_RDWR | O_CREAT , S_IWRITE | S_IREAD ) < 0 )) {
如果打开成功,则将fd设置为0,如果失败则设置为1。因为你将它设置为0,这是你的控制台,这就是它写“哈利波特”的地方,而不是磁盘。你不能在终端上寻找。你想要
if( (fd = open( "book.txt", O_RDWR | O_CREAT , S_IWRITE | S_IREAD )) < 0 ) {
另外
a)系统调用失败后无需检查errno!= 0。
b)你应该在出错时退出,而不是通过。
c)sizeof(char)始终为1,因此无需乘以它。
d)main应该有一个原型,例如int main(void)