Спецам по Linux
Проблема: при попытке открытия UTMP_FILE (/var/run/utmp) только для чтения, программа зависает намертво! Аттрибуты у файла 774 - по идее все должно быть нормально. Но открываться не хочет ни в какую, даже -1 не возвращает. Просто ждет нажатия Ctrl+C и ничего не делает.
каким образом ты открываешь файл?
каким образом ты открываешь файл?
open(UTMP_FILE,O_RDONLY) - после этой строчки виснет.
open(UTMP_FILE,O_RDONLY) - после этой строчки виснет.
начнем с того, что первый параметр должен быть полный путь к файлу (man open) если же у тебя программа находиться в том же каталоге - то open(./utmp,O_RDONLY);
пожалуйста приведи точный код, причем не одну строчку, а участок кода.
начнем с того, что первый параметр должен быть полный путь к файлу (man open) если же у тебя программа находиться в том же каталоге - то open(./utmp,O_RDONLY);
пожалуйста приведи точный код, причем не одну строчку, а участок кода.
Забыл написать, что пробовал и с полным путем. Вообще UTMP_FILE опледелен в utmp.h (сам убедился), т.е. полный путь к нему прописывать необязательно.
Вот кусок кода:
struct utmp curr_record;
int utmpfd;
int reclen = sizeof(curr_record);
if((utmpfd = open(UTMP_FILE, O_RDONLY) ==-1))
{
printf("Faild!");
perror(UTMP_FILE);
exit(1);
};
sizeof(curr_record) - срабатывает нормально: если поставить printf("%d",reclen), то выводится размер одной записи в utmp. А вот дальше - даже "Faild!" не выводит. О том, что идет далее (за if) можно и не говорить! До него дело не доходит. :(
Забыл написать, что пробовал и с полным путем. Вообще UTMP_FILE опледелен в utmp.h (сам убедился), т.е. полный путь к нему прописывать необязательно.
Вот кусок кода:
struct utmp curr_record;
int utmpfd;
int reclen = sizeof(curr_record);
if((utmpfd = open(UTMP_FILE, O_RDONLY) ==-1))
{
printf("Faild!");
perror(UTMP_FILE);
exit(1);
};
sizeof(curr_record) - срабатывает нормально: если поставить printf("%d",reclen), то выводится размер одной записи в utmp. А вот дальше - даже "Faild!" не выводит. О том, что идет далее (за if) можно и не говорить! До него дело не доходит. :(
хм... gdb и вперед. у меня аналогичный участок кода прошел на ура (Linux Slackware 10.0).
так что отлаживай и ищи грабли.
хм... gdb и вперед. у меня аналогичный участок кода прошел на ура (Linux Slackware 10.0).
так что отлаживай и ищи грабли.
Я прекрасно понимаю, что это должно проходить на ура. Но ни в какую. Кстати /usr/log/wtmp тоже страдает аналогичной порнографией. И с gdb тоже глюка - нормально не работает. Не подскажешь, где можно скачать для Mandrake 9.1? Поищу конечно сам, но все же буду очень благодарен!
Я прекрасно понимаю, что это должно проходить на ура. Но ни в какую. Кстати /usr/log/wtmp тоже страдает аналогичной порнографией. И с gdb тоже глюка - нормально не работает. Не подскажешь, где можно скачать для Mandrake 9.1? Поищу конечно сам, но все же буду очень благодарен!
что значит - "нормально не работает"??? подробнее... может ты просто коряво мандрагору поставил? бывает такое... не хватает чего либо, а система ругается.
что значит - "нормально не работает"??? подробнее... может ты просто коряво мандрагору поставил? бывает такое... не хватает чего либо, а система ругается.
Извиняюсь! Меня вчера знатно колбасило :)(бытовой тупяк). Совсем попутал! Нормально не работает Kdbg: вместо надписей - одни квадратики. Я так понял, это проблема локализованной версии. Не переведенные, английские надписи - нормальные.
А с gdb - полный порядок (командная строка рулит)! Попробую разобраться сам. Но все же загляни через денек-другой - если не осилю, придется опять помощь просить.
Заранее благодарен.
#include <stdio.h>
#include <utmp.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
void show_info(struct utmp *utbuf);
int main(void)
{
struct utmp curr_record;
int utmpfd;
int reclen = sizeof(curr_record);
printf("%d\n",reclen);
if((utmpfd = open(UTMP_FILE, O_RDONLY) ==-1))
{
printf("Faild!");
perror(UTMP_FILE);
exit(1);
};
while(read(utmpfd, &curr_record, reclen)== reclen)show_info(&curr_record);//Виснем здесь.
printf("%d\n",reclen);
close(utmpfd);
return EXIT_SUCCESS;
}
void show_info(struct utmp *utbuf)
{
printf("%-8.8s",utbuf->ut_name);
printf(" ");printf("%8.8s",utbuf->ut_line);
printf(" ");
printf("%10ld",utbuf->ut_time);
printf(" ");
#ifdef SHOWHOST printf("(%s)",utbuf->ut_host);
#endif printf("\n");
return;
}
Вот что выдает gdb в точке повисания:
Single stepping until exit from function read, which has no line number information.
Типа: ждемс пока read() занимается своим делом (исправь, если я опять что то не догнал). Только вопрос - каким делом она занимается бесконечно? Цикл while должен нормально работать при условии, что указатель в файле сдвигается посве каждой операции чтения. А прочитать то она и не может! Эта глюка именно в read(), т.к. если из show_info() удалить весь код, то это ничего не дает. Да и в gdb, в стеке read() находится на самом нижнем уровне, а show_info() еще не загружена.
И еще, сразу не обратил внимание, прога продолжает работать если нажать enter, т.е. просто происходит выход, с нормальным кодом возврата! Где она считывает с клавиатуры???
Буду разбираться дальше. Поможи, если чем можешь.