Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка ПО ОСРВ заочники.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
8.72 Mб
Скачать

2.5.3. Написание программы who 1.С

Итак, мы почти у цели. Мы знаем суть работы команды who, мы знаем о существовании трех системных вызовов, необходимых для установления связи с файлом, выбора данных из файла и для закрытия файла. Ведущая часть кода программы будет выглядеть так:

/* whol .с - первая версия программы who

* выполнить open, прочитать файл UTMP и показать результаты

7

#include <stdio.h>

#include <utmp.h>

«include <fcntl.h>

«include <unistd.h>

«define SHOWHOST /* подключить удаленную машину для вывода*/

Iint main()

{

struct utmp currentjecord; f* считывать сюда данные */

int utmpfd; /* читать из этого дескриптора */

int reclen = sizeof(currentjecord);

if ((utmpfd = open(UTMPFILE, O.RDONLY)K== -1){

perrorfUTMP FILE); /* UTMP FILE - описание в utmp.h */

exit(1);

}

(while (read(utmpfd, &current_ record, reclen) == reclen)

Show_jnfo( &current_record);

close(utmpfd);

return 0; /* все нормально */

}

В этой программе реализована логика, которая была рассмотрена выше в этой главе. В цикле while производится последовательное чтение записей из файлового дескриптора currentjecord. Функция showinfo отображает информацию о вхождениях в систему. Про­грамма работает в цикле до тех пор, пока системный вызов read в состоянии читать записи из файла. Наконец, происходит закрытие файла и выход из программы.

Системный вызов perror является удобным средством для оповещения о наличии систем­ных ошибок. Мы рассмотрим его далее в этой главе.

2.5.4. Отображение записей о вхождениях в систему

Далее приведен код первого наброска функции show_info, которая производит отображе­ние информации из файла utmp.

/*

* show_info()

* отображает содержимое структуры utmp в формате, удобном для восприятия

* эти размеры аппаратно не зашиты

*/

show_info(struct utmp *utbufp)

{

printf("%-8.8s", utbufp->ut_name);

/* входное имя */

printf("");

/* пробел */

printf("%-8.8s", utbufp->ut_line);

/* терминал */

printff'");

/*пробел */

printf("%10ld", utbufp->ut time);

/* время вхождения */

prtntf("");

Г пробел */

#ifdefSHOWHOST

printf("(%s)", utbufp->ut_host);

/* хост */

#endif

printf("\n”);

/* перевод на новую строку */

Мы выбрали в этой программе ширину полей для printf так, чтобы было соответствие с длинами строк вывода системной версии программы^ who. Программа выводит элемент utjime в формате long int. Значение time_t определено в/ заголовочном файле, но мы пока ничего об этом не знаем. У

Компилируем и запускаем программу на исполнение:

$ccwho1.c-owho1

$who1

system b

9526014110

run-leve

9526014110

9526014160

952601416 0

952601417 0

952601417 0

9526014190

9526014190

952601423 ()

952601566 0

LOGIN console

952601566 0

ttypl

958240622 0

shpyrko ttyp2

964318862 (nas1-093.gas.swamp.org)

acotton ttyp3

964319088 (math-guest04.williams.edu)

ttyp4

964320298 0

spradlin ttyp5

963881486 (h002078c6adfb.ne.rusty.net)

dkoh ttyp6

964314388(128.103.223.110)

spradlin ttyp7

964058662 (h002078c6adfb.ne.rusty.net)

king ttyp8

964279969 (blade-runner.mit.edu)

berschba ttyp9

964188340 (dudley.learned.edu)

rserved ttypa

963538145 (gigue.eas.ivy.edu)

dabel ttypb

964319455 (roam 193-27.student.state.edu)

ttypc

964319645 0

rserved ttypd

963538287 (gigue.eas.ivy.edu)

dkoh ttype

964298769(128:103.223.110)

ttypf

964314510 0

molay ttyqO

964310621 (xyz73-200.harvard.edu)

ttyql

964311665 0

ttyq2

964310757 0

ttyq3

964304284 ()

ttyq4

964305014 0

ttyq5

964299803 ()

ttyq6

964219533 0

ttyq7

964215661 ()

cweiner ttyq8

964212019 (roarn175-157.student.stats.edu)

ttyqa 964277078 ()

ttyq9 964231347 0

$

Давайте сравним вывод нашей программы с выводом системной версии команды who:

$who

shpyrko ttyp2Jul

22 22:21

(nasi -093.gas.swamp.edu)

acotton ttyp3 Jul

22 22:24

(math-guest04.williams.edu)

spradlin ttyp5Jul

17 20:51

(h002078c6adfb.ne.rusty.net)

dkoh ttyp6 Jul

22 21:06

(128.103.223.110)

spradlin ttyp7Jul

19 22:04

(h002078c6adfb.ne.rusty.net)

king ttyp8 Jul

22 11:32

(blade-runner.mit.edu)

berschba ttyp9 Jul

21 10:05

(dudley.learned.edu)

rserved ttypa Jul

13 21:29

(gigue.eas.ivy.edu)

dabel ttypb Jul

22 22:30

(roam I53-27.student.state.edu)

rserved ttypd Jul

13 21:31

(gigue.eas.harvard.edu)

dkoh ttype Jul

22 16:46

(128.103.223.110)

molay ttyqO Jul

2220:03

(xyz73-200.harvard.edu)

cweiner ttyq8 Jul

21 16:40

(roam175- 157.student.stats.edu)

$

Наша версия выглядит как перспективная, но все еще не в полном виде. Есть еще шерохо­ватости, которые следует ликвидировать. У нас выводятся те же пользовательские имена,

как и в who. У нас выводятся правильные имена терминалов, правильно указываются имена удаленных машин. Но есть две проблемы.

Что нам следует еще сделать:

■ Подавить пустые записи.

■ Получить корректное представление времени вхождения в систему.