我很难弄清楚为什么lseek不能正常工作。基本上,我需要做的就是从标准输入中获取输入,将其存储到一个名为"log.txt“的文件中,然后让程序在遇到" stop”这个词时停止。
我的问题是,当我试图运行这个程序时,我得到了一个lseek错误:非法的seek,我不知道为什么。我认为问题出在调用lseek,但是如果我用lseek(fd, atol(0), SEEK_END)替换lseek(fd, 0, SEEK_END),我会得到一个分段错误。
我只是太困惑了,我不知道该怎么做才能解决这个问题,希望你能给我一些建议。
int fd;
char buffer[SIZE];
int n, cur;
if (fd = open("log.txt", O_RDWR, S_IRWXU|S_IRWXG|S_IRWXO) < 0)
{
perror("Error: open");
return 1;
}
if ((cur = lseek(fd, 0, SEEK_END)) < 0)
{
printf("Offset corrente: %d\n", (int) lseek(fd, SIZE, SEEK_CUR));
perror("Error: lseek");
return 2;
}
while ((n = read(fd, buffer, SIZE)) > 0 && (strncmp(buffer, "STOP", 4) != 0))
{
write(fd, buffer, SIZE);
}发布于 2011-05-21 21:57:30
if (fd = open("log.txt", O_RDWR, S_IRWXU|S_IRWXG|S_IRWXO) < 0)应该是
if ((fd = open("log.txt", O_RDWR, S_IRWXU|S_IRWXG|S_IRWXO)) < 0)否则它将被解析为
if (fd = (open("log.txt", O_RDWR, S_IRWXU|S_IRWXG|S_IRWXO) < 0))(因为<具有比=更高的运算符优先级);如果open()成功,它将返回一个>=为0的值,因此表达式open(...) < 0将为false,因此fd将设置为0。
文件描述符0表示流程的标准输入。除非你已经重定向,否则这将是一个终端设备,寻找是非法的。
发布于 2011-05-21 21:42:24
您正在读取和写入相同的文件
read(fd, buffer, SIZE)是错误的。您想要从stdin中读取。
发布于 2013-12-11 00:23:42
if ((cur = lseek(fd, 0, SEEK_END)) < 0)应更改为:
if ((cur = lseek(fd, 0, SEEK_END)) == -1)在某些情况下,lseek可能会提供负的偏移量。因此,在测试错误时,应该只使用x == -1,而不是x< 0。
https://stackoverflow.com/questions/6082083
复制相似问题