Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Спецам по Linux

243
11 октября 2004 года
pacific_7
1.9K / / 06.09.2004
Проблема: при попытке открытия UTMP_FILE (/var/run/utmp) только для чтения, программа зависает намертво! Аттрибуты у файла 774 - по идее все должно быть нормально. Но открываться не хочет ни в какую, даже -1 не возвращает. Просто ждет нажатия Ctrl+C и ничего не делает.
2
11 октября 2004 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by pacific_7
Проблема: при попытке открытия UTMP_FILE (/var/run/utmp) только для чтения, программа зависает намертво! Аттрибуты у файла 774 - по идее все должно быть нормально. Но открываться не хочет ни в какую, даже -1 не возвращает. Просто ждет нажатия Ctrl+C и ничего не делает.


каким образом ты открываешь файл?

243
13 октября 2004 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by squirL

каким образом ты открываешь файл?


open(UTMP_FILE,O_RDONLY) - после этой строчки виснет.

2
13 октября 2004 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by pacific_7

open(UTMP_FILE,O_RDONLY) - после этой строчки виснет.


начнем с того, что первый параметр должен быть полный путь к файлу (man open) если же у тебя программа находиться в том же каталоге - то open(./utmp,O_RDONLY);
пожалуйста приведи точный код, причем не одну строчку, а участок кода.

243
14 октября 2004 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by squirL

начнем с того, что первый параметр должен быть полный путь к файлу (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) можно и не говорить! До него дело не доходит. :(

2
14 октября 2004 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by pacific_7

Забыл написать, что пробовал и с полным путем. Вообще 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).
так что отлаживай и ищи грабли.

243
15 октября 2004 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by squirL


хм... gdb и вперед. у меня аналогичный участок кода прошел на ура (Linux Slackware 10.0).
так что отлаживай и ищи грабли.


Я прекрасно понимаю, что это должно проходить на ура. Но ни в какую. Кстати /usr/log/wtmp тоже страдает аналогичной порнографией. И с gdb тоже глюка - нормально не работает. Не подскажешь, где можно скачать для Mandrake 9.1? Поищу конечно сам, но все же буду очень благодарен!

2
15 октября 2004 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by pacific_7

Я прекрасно понимаю, что это должно проходить на ура. Но ни в какую. Кстати /usr/log/wtmp тоже страдает аналогичной порнографией. И с gdb тоже глюка - нормально не работает. Не подскажешь, где можно скачать для Mandrake 9.1? Поищу конечно сам, но все же буду очень благодарен!


что значит - "нормально не работает"??? подробнее... может ты просто коряво мандрагору поставил? бывает такое... не хватает чего либо, а система ругается.

243
16 октября 2004 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by squirL

что значит - "нормально не работает"??? подробнее... может ты просто коряво мандрагору поставил? бывает такое... не хватает чего либо, а система ругается.


Извиняюсь! Меня вчера знатно колбасило :)(бытовой тупяк). Совсем попутал! Нормально не работает Kdbg: вместо надписей - одни квадратики. Я так понял, это проблема локализованной версии. Не переведенные, английские надписи - нормальные.
А с gdb - полный порядок (командная строка рулит)! Попробую разобраться сам. Но все же загляни через денек-другой - если не осилю, придется опять помощь просить.
Заранее благодарен.

243
18 октября 2004 года
pacific_7
1.9K / / 06.09.2004
Я ошибался! Програмка виснет не при открытии, а при чтении файла. Что бы не мучать дальше одно место, вот весь код:
#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, т.е. просто происходит выход, с нормальным кодом возврата! Где она считывает с клавиатуры???
Буду разбираться дальше. Поможи, если чем можешь.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог