Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
7879 /* Напечатать результат */80 printf("Sorted by ID:n");81 for (i = 0; i < npres; i++) {82 putchar('t');83 print_employee(&presidents[i]);84 }8586 for (;;) {87 printf("Enter ID number: ");88 if (fgets(buf, BUFSIZ, stdin) == NULL)89 break;9091 sscanf(buf, "%dn", &id);92 key.emp_id = id;93 the_pres = (struct employee*)bsearch(&key, presidents,94 npres, sizeof(struct employee), emp_id_compare);9596 if (the_pres != NULL) {97 printf("Found: ");98 print_employee(the_pres);99 } else100 printf("Employee with ID %d not found'n", id);101 }102103 putchar('n'); /* Напечатать в конце символ новой строки. */104105 exit(0);106 }Функция
main()Строки 77–84 сортируют, а затем печатают данные. Затем программа входит в цикл, начинающийся со строки 86. Она запрашивает идентификационный номер сотрудника, выходя из цикла по достижению конца файла. Для поиска в массиве мы используем
struct employeekeyЕсли найден элемент с подходящим ключом,
bsearch()NULL$ <b>ch06-searchemp presdata.txt</b> /* Запуск программы */Sorted by ID: Carter James 39 Thu Jan 20 13:00:00 1977 Reagan Ronald 40 Tue Jan 20 13:00:00 1981 Bush George 41 Fri Jan 20 13:00:00 1989 Clinton William 42 Wed Jan 20 13:00:00 1993 Bush George 43 Sat Jan 20 13:00:00 2001Enter ID number: <b>42</b> /* Ввод действительного номера */Found: Clinton William 42 Wed Jan 20 13:00:00 1993 /* Найдено */Enter ID number: <b>29</b> /* Ввод неверного номера */Employee with ID 29 not found! /* He найдено */Enter ID number: <b>40</b> /* Попытка другого верного номера */Found: Reagan Ronald 40 Tue Jan 20 13:00:00 1981 /* Этот тоже найден */Enter ID number: <b>^D</b> /* CTRL-D в качестве конца файла */$ /* Готов к приему следующей команды */Дополнительный, более продвинутый API для поиска коллекций данных описан в разделе 14.4 «Расширенный поиск с использованием двоичных деревьев».
6.3. Имена пользователей и групп
Хотя операционная система для сохранения владельцев файлов и проверки прав доступа работает с идентификационными номерами пользователей и групп, люди предпочитают работать с именами пользователей и групп.
Ранние системы Unix хранили информацию, сопоставляющую имена с номерами ID, в простых текстовых файлах
/etc/passwd/etc/group/etc/passwd/etc/groupAPI для этих двух баз данных похожи; большая часть обсуждения фокусируется на базе данных пользователей.
6.3.1. База данных пользователей
Традиционный формат /etc/passwd поддерживает по одной строке на пользователя. В каждой строке есть несколько полей, каждое из которых отделено от следующего символом двоеточия:
$ <b>grep arnold /etc/passwd</b>arnold:x:2076:10:Arnold D. Robbins:/home/arnold:/bin/bashПо порядку эти поля следующие:
Имя пользователя
Это то, что пользователь набирает при регистрации, что отображается с помощью '
ls -lПоле пароля
На старых системах здесь хранился зашифрованный пароль пользователя. На новых системах в этом поле скорее всего стоит x (как в данном случае), это означает, что сведения о пароле находятся в другом файле. Это разделение является средством обеспечения безопасности; если непривилегированному пользователю недоступен зашифрованный пароль, его значительно сложнее «взломать».
ID пользователя
Должен быть уникальным; один номер на пользователя.
ID группы
Это номер ID начальной группы пользователя. Как обсуждается далее, на современных системах с процессами связаны несколько групп.