вопросы lseek - PullRequest
       13

вопросы lseek

1 голос
/ 21 мая 2011

Мне трудно понять, почему lseek не работает должным образом.По сути, все, что мне нужно сделать, это взять данные из стандартного ввода, сохранить их в файле с именем «log.txt» и позволить программе остановиться, когда встречается слово «STOP».

Моя проблема в том, что япопытаться запустить программу, я получаю ошибку lseek: незаконный поиск, и я не знаю почему.Я думал, что проблема была в вызове lseek, но если я заменил lseek(fd, 0, SEEK_END) на lseek(fd, atol(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);
}

Ответы [ 4 ]

4 голосов
/ 21 мая 2011
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 будет ложным, поэтому fd будет установлено в 0.

Файловый дескриптор 0 представляет стандартный ввод для вашего процесса. Если вы не перенаправили его, это будет терминальное устройство, поиск которого запрещен.

3 голосов
/ 21 мая 2011

Вы читаете и пишете в один и тот же файл

 read(fd, buffer, SIZE)

Это неправильно. Вы хотите читать со стандартного ввода.

2 голосов
/ 10 декабря 2013
if ((cur = lseek(fd, 0, SEEK_END)) < 0)

следует изменить на:

if ((cur = lseek(fd, 0, SEEK_END)) == -1)

В определенных ситуациях lseek может предоставить отрицательное смещение. В результате при проверке на наличие ошибки следует использовать только x == -1 вместо x <0. </p>

1 голос
/ 21 мая 2011

Мало того, что вы читаете один и тот же файл, read () читает SIZE байтов. Если ваш ввод не является фиксированной длиной записи байтов SIZE, вы будете читать несколько строк, полностью пропуская STOP, который сейчас находится в середине буфера.

while (fgets (buffer, sizeof (buffer), stdin) && (strncmp (buffer, "STOP", 4)! = 0))

Читает строку за раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...