Linux программирование в примерах

На нашем литературном портале можно бесплатно читать книгу Linux программирование в примерах, Роббинс Арнольд-- . Жанр: Программирование / ОС и Сети. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
Linux программирование в примерах
Название: Linux программирование в примерах
Дата добавления: 16 январь 2020
Количество просмотров: 559
Читать онлайн

Linux программирование в примерах читать книгу онлайн

Linux программирование в примерах - читать бесплатно онлайн , автор Роббинс Арнольд

В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.

 

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

1 ... 47 48 49 50 51 52 53 54 55 ... 253 ВПЕРЕД
Перейти на страницу:

Новым каталогам, как и всем файлам, присваивается идентификационный номер группы. К сожалению, его работа запутана. Мы отложим обсуждение до раздела 11.5.1 «Группа по умолчанию для новых файлов и каталогов».

Обе функции работают на одном уровне каталога за раз. Если

/somedir
существует, a
/somedir/sub1
нет, '
mkdir("/somedir/sub1/sub2")
' завершится неудачей. Каждый компонент в длинном пути должен создаваться отдельно (в соответствии с опцией
-р mkdir
, см. mkdir(1)).

Также, если

pathname
завершается символом '
/
', на некоторых системах
mkdir()
и
rmdir()
потерпят неудачу, а на других нет. Следующая программа,
ch05-trymkdir.с
, демонстрирует оба аспекта.

1  /* ch05-trymkdir.c --- Демонстрирует поведение mkdir().

2     Любезность Nelson H.F. Beebe. */

3

4  #include <stdio.h>

5  #include <stdlib.h>

6  #include <errno.h>

7

8  #if !defined(EXIT_SUCCESS)

9  #define EXIT_SUCCESS 0

10 #endif

11

12 void do_test(const char *path)

13 {

14  int retcode;

15

16  errno = 0;

17  retcode = mkdir(path, 0755);

18  printf("mkdir("%s") returns %d: errno = %d [%s)n",

19   path, retcode, errno, strerror(errno));

20 }

21

22 int main(void)

23 {

24  do_test("/tmp/t1/t2/t3/t4"); /*Попытка создания в подкаталоге*/

25  do_test("/tmp/t1/t2/t3");

26  do_test("/tmp/t1/t2");

27  do_test("/tmp/t1");

28

29  do_test("/tmp/u1"); /* Создать подкаталоги */

30  do_test("/tmp/u1/u2");

31  do_test("/tmp/u1/u2/u3");

32  do_test("/tmp/u1/u2/u3/u4");

33

34  do_test("/tmp/v1/"); /* Как обрабатывается завершающий '/'? */

35  do_test("/tmp/v1/v2/");

36  do_test("/tmp/v1/v2/v3/");

37  do_test("/tmp/v1/v2/v3/v4/");

38

39  return(EXIT_SUCCESS);

40 }

Вот результаты для GNU/Linux:

$ <b>ch05-trymkdir</b>

mkdir(&quot;/tmp/t1/t2/t3/t4&quot;) returns -1: errno = 2 [No such file or directory)

mkdir(&quot;/tmp/t1/t2/t3&quot;) returns -1: errno = 2 [No such file or directory)

mkdir(&quot;/tmp/t1/t2&quot;) returns -1: errno = 2 [No such file or directory]

mkdir(&quot;/tmp/t1&quot;) returns 0: errno = 0 [Success]

mkdir(&quot;/tmp/u1&quot;) returns 0: errno = 0 [Success]

mkdir(&quot;/tmp/u1/u2&quot;) returns 0: errno = 0 [Success]

mkdir(&quot;/tmp/u1/u2/u3&quot;) returns 0: errno = 0 [Success]

mkdir(&quot;/tmp/u1/u2/u3/u4&quot;) returns 0: errno = 0 [Success]

mkdir(&quot;/tmp/v1/&quot;) returns 0: errno = 0 [Success]

mkdir(&quot;/tmp/v1/v2/&quot;) returns 0: errno = 0 (Success]

mkdir(&quot;/tmp/v1/v2/v3/&quot;) returns 0: errno = 0 [Success]

mkdir(&quot;/tmp/v1/v2/v3/v4/&quot;) returns 0: errno = 0 [Success]

Обратите внимание, как GNU/Linux принимает завершающий слеш. Не все системы так делают.

5.3. Чтение каталогов

В оригинальных системах Unix чтение содержимого каталогов было просто. Программа открывала каталог с помощью

open()
и непосредственно читала двоичные структуры
struct direct
, по 16 байтов за раз. Следующий фрагмент кода из программы V7
rmdir
[53], строки 60–74. Он показывает проверку на пустоту каталога.

60 if ((fd = open(name, 0)) &lt; 0) {

61  fprintf(stderr, &quot;rmdir: %s unreadablen&quot;, name);

62  ++Errors;

63  return;

64 }

65 while (read(fd, (char*)&amp;dir, sizeof dir) == sizeof dir) {

66  if (dir.d_ino == 0) continue;

67  if (!strcmp(dir.d_name, &quot;.&quot;) || !strcmp(dir.d_name, &quot;..&quot;))

68   continue;

69  fprintf(stderr, &quot;rmdir: %s not emptyn&quot;, name);

70  ++Errors;

71  close(fd);

72  return;

73 }

74 close(fd);

В строке 60 каталог открывается для чтения (второй аргумент равен 0, что означает

O_RDONLY
). В строке 65 читается
struct direct
. В строке 66 проверяется, не является ли элемент каталога пустым, т. е. с номером индекса 0. Строки 67 и 68 проверяют на наличие '
.
' и '
..
'. По достижении строки 69 мы знаем, что было встречено какое-то другое имя файла, следовательно, этот каталог не пустой.

1 ... 47 48 49 50 51 52 53 54 55 ... 253 ВПЕРЕД
Перейти на страницу:
Комментариев (0)
название