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

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

На нашем литературном портале можно бесплатно читать книгу Linux программирование в примерах - Роббинс Арнольд, Роббинс Арнольд . Жанр: Интернет. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале litmir.org.
Linux программирование в примерах - Роббинс Арнольд
Название: Linux программирование в примерах
Дата добавления: 17 сентябрь 2020
Количество просмотров: 341
Читать онлайн

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

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

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

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

 

Перейти на страницу:

Давайте свяжем все это воедино в примере программы.

ch08-nftw.c
обрабатывает каждый файл или каталог, указанный в командной строке, запуская для них
nftw()
. Функция, обрабатывающая каждый файл, выводите отступом имя и тип файла, показывая иерархическое положение каждого файла. Для разнообразия мы сначала покажем результаты, а затем покажем и обсудим программу:

$ <b>pwd</b> /* Где мы находимся */

/ home/аrnold/work/prenhall/progex

$ <b>code/ch08/ch08-nftw code</b> /* Обойти каталог 'code' */

code (directory) /* Каталог верхнего уровня */

  ch02 (directory) /* Подкаталоги с отступом на один уровень */

    ch02-printenv.c (file) /* Файлы в подкаталоге с отступом

                              на два уровня */

  ch03 (directory)

    ch03-memaddr.c (file)

  ch04 (directory)

    ch04-holes.c (file)

    ch04-cat.с (file)

    ch04-maxfds.c (file)

    v7cat.c (file)

...

Вот сама программа:

1  /* ch08-nftw.c --- демонстрирует nftw() */

2

3  #define _XOPEN_SOURCE 1 /* Требуется под GLIBC для nftw() */

4  #define _XOPEN_SOURCE_EXTENDED 1 /* To же */

5

6  #include &lt;stdio.h&gt;

7  #include &lt;errno.h&gt;

8  #include &lt;getopt.h&gt;

9  #include &lt;ftw.h&gt; /* получает для нас &lt;sys/types.h&gt; и &lt;sys/stat.h&gt; */

10 #include &lt;limits.h&gt; /* для PATH_MAX */

11 #include &lt;unistd.h&gt; /* для объявлений getdtablesize(), getcwd() */

12

13 #define SPARE_FDS 5 /* fds для использования другими функциями, см. текст */

14

15 extern int process(const char *file, const struct stat *sb,

16  int flag, struct FTW *s);

17

18 /* usage --- print message and die */

19

20 void usage(const char *name)

21 {

22  fprintf(stderr, &quot;usage: %s (-c) directory ...n&quot;, name);

23  exit(1);

24 }

25

26 /* main --- вызвать nftw() для каждого аргумента командной строки */

27

28 int main(int argc, char **argv)

29 {

30  int i, c, nfds;

31  int errors = 0;

32  int flags = FTW_PHYS;

33  char start[PATH_MAX], finish[PATH_MAX];

34

35  while ((c = getopt(argc, argv, &quot;с&quot;)) != -1) {

36   switch (c) {

37   case 'c':

38    flags |= FTW_CHDIR;

39    break;

40   default:

41    usage(argv[0]);

42    break;

43   }

44  }

45

46  if (optind == argc)

47   usage(argv[0]);

48

49  getcwd(start, sizeof start);

50

51  nfds = getdtablesize() - SPARE_FDS; /* оставить несколько запасных дескрипторов */

52  for (i = optind; i &lt; argc; i++) {

53   if (nftw(argv[i], process, nfds, flags) != 0) {

54    fprintf(stderr, &quot;%s: %s: stopped earlyn&quot;,

55     argv[0], argv[i]);

56    errors++;

57   }

58  }

59

60  if ((flags &amp; FTW_CHDIR) != 0) {

61   getcwd(finish, sizeof finish);

62   printf(&quot;Starting dir: %sn&quot;, start);

63   printf(&quot;Finishing dir: %sn&quot;, finish);

64  }

65

66  return (errors != 0);

67 }

Строки 3–11 включают заголовочные файлы. По крайней мере в GLIBC 2.3.2 перед включением любого заголовочного файла необходимы

#define
для
_XOPEN_SOURCE
и
_XOPEN_SOURCE_EXTENDED
. Они дают возможность получить объявления и значения флагов, которые
nftw()
предоставляет свыше предоставляемых
ftw()
. Это специфично для GLIBC. Потребность в этом в конечном счете исчезнет, когда GLIBC станет полностью совместимой со стандартом POSIX 2001.

Строки 35–44 обрабатывают опции. Опция

добавляет к флагам
nftw() FTW_CHDIR
. Это эксперимент с целью увидеть, сможете ли вы оказаться где-то в другом месте от того, где начинали. Кажется, это возможно, если
nftw()
завершается неудачей, в противном случае вы заканчиваете там же, где начинали. (POSIX не документирует это явным образом, но целью, похоже, было действительно заканчивать там же, где начинали. Стандарт не говорит, что функция обратного вызова не должна менять текущий каталог.)

Перейти на страницу:
Комментариев (0)