Программирование в стандарте POSIX


Описание функции


#include <unistd.h> char *getcwd (char *buf, size_t size);
Листинг 4.1. Описание функции getcwd().
Закрыть окно




#include <stdlib.h> #include <unistd.h> #include <stdio.h> int main (void) { size_t size; char *buf; char *apath; /* Выясним, каким должен быть размер буфера */ /* для абсолютного маршрутного имени текущего каталога */ size = (size_t) pathconf (".", _PC_PATH_MAX); if ((buf = (char *) malloc (size)) == NULL) { fprintf (stderr, "\nНе удалось выделить буфер размера %d\n", size); return 1; } if ((apath = getcwd (buf, size)) == NULL) { fprintf (stderr, "\nНе удалось определить абсолютное маршрутное имя текущего каталога\n"); return 1; } printf ("\nАбсолютное маршрутное имя текущего каталога: %s\n", apath); return 0; }
Листинг 4.2. Пример использования функции getcwd().
Закрыть окно




total 338 drwxrwxr-x 2 root root 4096 Jul 6 13:31 a drwxr-xr-x 2 root root 4096 Jul 8 13:32 bin drwxr-xr-x 4 root root 1024 Jul 6 15:06 boot drwxrwxr-x 2 root root 4096 Jul 6 13:31 cdrom drwxr-xr-x 18 root root 86016 Sep 2 10:42 dev drwxr-xr-x 6 root root 4096 Feb 23 2003 dss drwxr-xr-x 60 root root 4096 Sep 2 10:42 etc drwxr-xr-x 20 root root 4096 Jul 15 18:00 home drwxr-xr-x 2 root root 4096 Jun 12 2001 initrd drwxr-xr-x 8 root root 4096 Aug 8 13:16 lib drwx------ 2 root root 16384 Jul 6 14:15 lost+found drwxr-xr-x 2 root root 4096 Apr 1 2002 misc drwxr-xr-x 5 root root 4096 Jul 6 11:24 mnt drwxr-xr-x 7 root root 4096 Jul 23 13:09 opt dr-xr-xr-x 84 root root 0 Sep 2 2003 proc drwxr-x--- 5 root root 4096 Sep 1 17:10 root drwxr-xr-x 2 root root 4096 Jul 11 17:38 sbin drwxrwxrwt 23 root root 8192 Sep 2 12:43 tmp drwxr-xr-x 14 root root 4096 Jul 15 12:50 usr drwxr-xr-x 16 root root 4096 Jul 9 16:22 var
Пример 4.3. Возможный результат использования служебной программы ls
Закрыть окно






cd /usr/share/zoneinfo/posix ls -il UTC Universal Zulu
Листинг 4.4. Еще один пример использования служебной программы ls.
Закрыть окно




2506763 -rw-r--r-- 6 root root 56 Apr 15 2002 UTC 2506763 -rw-r--r-- 6 root root 56 Apr 15 2002 Universal 2506763 -rw-r--r-- 6 root root 56 Apr 15 2002 Zulu
Листинг 4.5. Возможный результат использования служебной программы ls.
Закрыть окно




cd /bin ls - il ex rvi rview vi view
Листинг 4.6. Применение служебной программы ls для выдачи информации о символьных ссылках.
Закрыть окно




4849722 lrwxrwxrwx 1 root root 2 Jul 6 14:17 ex -> vi 4849723 lrwxrwxrwx 1 root root 2 Jul 6 14:17 rvi -> vi 4849724 lrwxrwxrwx 1 root root 2 Jul 6 14:17 rview -> vi 4849725 -rwxr-xr-x 1 root root 386120 Mar 8 2002 vi 4849726 lrwxrwxrwx 1 root root 2 Jul 6 14:17 view -> vi
Листинг 4.7. Возможный результат использования служебной программы ls при выдаче информации о символьных ссылках.
Закрыть окно




4849725 -rwxr-xr-x 1 root root 386120 Mar 8 2002 ex 4849725 -rwxr-xr-x 1 root root 386120 Mar 8 2002 rvi 4849725 -rwxr-xr-x 1 root root 386120 Mar 8 2002 rview 4849725 -rwxr-xr-x 1 root root 386120 Mar 8 2002 vi 4849725 -rwxr-xr-x 1 root root 386120 Mar 8 2002 view
Листинг 4.8. Возможный результат использования служебной программы ls при выдаче информации о символьных ссылках и наличии опции -L.
Закрыть окно




ls -l /dev/ttyp[0-3] /dev/fd[2-5]
Листинг 4.9. Пример использования служебной программы ls для выдачи информации о специальных файлах.
Закрыть окно




brw-rw---- 1 root floppy 2, 2 Apr 1 2002 /dev/fd2 brw-rw---- 1 root floppy 2, 3 Apr 1 2002 /dev/fd3 brw-rw---- 1 root floppy 2, 128 Apr 1 2002 /dev/fd4 brw-rw---- 1 root floppy 2, 129 Apr 1 2002 /dev/fd5 crw-rw-rw- 1 root root 3, 0 Sep 2 17:21 /dev/ttyp0 crw-rw-rw- 1 root tty 3, 1 Apr 1 2002 /dev/ttyp1 crw-rw-rw- 1 root tty 3, 2 Apr 1 2002 /dev/ttyp2 crw-rw-rw- 1 root tty 3, 3 Apr 1 2002 /dev/ttyp3
Листинг 4.10. Возможный результат использования служебной программы ls при выдаче информации о специальных файлах.
Закрыть окно




total 0 prw--w---- 1 root root 0 Sep 2 10:42 xdmctl prw--w---- 1 shmyrev root 0 Sep 2 10:42 xdmctl-:0
Листинг 4.11. Возможный результат использования служебной программы ls при выдаче информации о каналах.
Закрыть окно




srwx------ 1 shmyrev root 0 Sep 2 10:42 /dev/gpmctl srw-rw-rw- 1 root root 0 Sep 2 10:42 /dev/log
Листинг 4.12. Возможный результат использования служебной программы ls при выдаче информации о сокетах.
Закрыть окно




total 338 drwxrwxrwt 23 root root 8192 Sep 2 16:26 tmp dr-xr-xr-x 143 root root 0 Sep 2 14:42 proc drwxr-xr-x 60 root root 4096 Sep 2 10:42 etc drwxr-xr-x 18 root root 86016 Sep 2 10:42 dev drwxr-x--- 5 root root 4096 Sep 1 17:10 root drwxr-xr-x 8 root root 4096 Aug 8 13:16 lib drwxr-xr-x 7 root root 4096 Jul 23 13:09 opt drwxr-xr-x 20 root root 4096 Jul 15 18:00 home drwxr-xr-x 14 root root 4096 Jul 15 12:50 usr drwxr-xr-x 2 root root 4096 Jul 11 17:38 sbin drwxr-xr-x 16 root root 4096 Jul 9 16:22 var drwxr-xr-x 2 root root 4096 Jul 8 13:32 bin drwxr-xr-x 4 root root 1024 Jul 6 15:06 boot drwx------ 2 root root 16384 Jul 6 14:15 lost+found drwxrwxr-x 2 root root 4096 Jul 6 13:31 cdrom drwxrwxr-x 2 root root 4096 Jul 6 13:31 a drwxr-xr-x 5 root root 4096 Jul 6 11:24 mnt drwxr-xr-x 6 root root 4096 Feb 23 2003 dss drwxr-xr-x 2 root root 4096 Apr 1 2002 misc drwxr-xr-x 2 root root 4096 Jun 12 2001 initrd
Листинг 4.13. Возможный результат использования служебной программы ls с сортировкой файлов по времени последнего изменения.
Закрыть окно




#include <sys/stat.h> int stat (const char * restrict path, struct stat *restrict buf); #include <sys/stat.h> int fstat (int fildes, struct stat *buf); #include <sys/stat.h> int lstat (const char *restrict path, struct stat *restrict buf);
Листинг 4.14. Описание функций семейства stat().
Закрыть окно




/* Программа выдает информацию о файлах - аргументах командной строки */ #include <sys/types.h> #include <sys/stat.h> #include <stdio.h>
/* Функция возвращает односимвольное обозначение типа файла */ /* Для неизвестного типа возвращается 'u' */ static char my_filetype (const mode_t mode) { switch (mode &S_IFMT) { case S_IFDIR: return ('d'); case S_IFBLK: return ('b'); case S_IFCHR: return ('c'); case S_IFLNK: return ('l'); case S_IFIFO: return ('p'); case S_IFREG: return ('-'); case S_IFSOCK: return ('s'); default: return ('u'); } } int main (int argc, char *argv[]) { struct stat buf; int i; for (i = 1; i < argc; i++) { if (stat (argv [i], &buf)) { fprintf (stderr, "\nstat: не удалось получить информацию о файле %s\n", argv [i]); return (-1); }
printf ("\nstat-информация о файле %s:\n", argv [i]); printf ("Тип: %c\n", my_filetype (buf.st_mode)); printf ("Размер: %ld\n", buf.st_size);
if (lstat (argv [i], &buf)) { fprintf (stderr, "\nlstat: не удалось получить информацию о файле %s\n", argv [i]); return (-1); }
printf ("\nlstat-информация о файле %s:\n", argv [i]); printf ("Тип: %c\n", my_filetype (buf.st_mode)); printf ("Размер: %ld\n", buf.st_size); }
return 0; }
Листинг 4.15. Пример использования функций stat() и lstat().
Закрыть окно




stat-информация о файле /bin/view: Тип: - Размер: 386120 lstat-информация о файле /bin/view: Тип: l Размер: 2 stat-информация о файле /bin/vi: Тип: - Размер: 386120 lstat-информация о файле /bin/vi: Тип: - Размер: 386120
Листинг 4.16. Возможный результат работы программы, использующей функции stat() и lstat().
Закрыть окно




#include <sys/statvfs.h> int fstatvfs ( int fildes, struct statvfs *buf); int statvfs (const char *restrict path, struct statvfs *restrict buf);
Листинг 4.17. Описание функций fstatvfs() и statvfs().
Закрыть окно




Filesystem 1024- blocks Used Available Capacity Mounted on /dev/sda3 75822432 43456504 28514348 61% / /dev/sda1 46636 21129 23099 48% /boot none 257212 0 257212 0% /dev/shm /dev/fd0 1424 392 1032 28% /a
Листинг 4.18. Возможный результат выполнения командной строки df -kP.
Закрыть окно




#include <sys/statvfs.h> #include <stdio.h>
int main (int argc, char *argv[]) { struct statvfs buf; int i;
for (i = 1; i < argc; i++) { if (statvfs (argv [i], &buf)) { fprintf (stderr, "\nstatvfs: не удалось получить информацию о файловой системе, содержащей файл %s\n", argv [i]); return (-1); }
printf ("\nstatvfs-информация о файловой системе, содержащей файл %s:\n", argv [i]); printf ("Размер блока файловой системы: %ld\n", buf.f_bsize); printf ("Базовый размер блока файловой системы: %ld\n", buf.f_frsize); printf ("Общее число блоков базового размера в файловой системе: %ld\n", buf.f_blocks); printf ("Общее число свободных блоков: %ld\n", buf.f_bfree); printf ("Число свободных блоков, доступных непривилегированным процессам: %ld\n", buf.f_bavail); printf ("Общее число описателей файлов: %ld\n", buf.f_files); printf ("Общее число свободных описателей файлов: %ld\n", buf.f_ffree); printf ("Число описателей файлов, доступных непривилегированным процессам: %ld\n", buf.f_favail); printf ("Идентификатор файловой системы: %ld\n", buf.f_fsid); printf ("Битная шкала флагов: %lx\n", buf.f_flag); printf ("Максимальная длина имени файла: %ld\n", buf.f_namemax); }
return 0; }
Листинг 4.19. Пример использования функции statvfs().
Закрыть окно




statvfs-информация о файловой системе, содержащей файл /: Размер блока файловой системы: 4096 Базовый размер блока файловой системы: 4096 Общее число блоков базового размера в файловой системе: 18955608 Общее число свободных блоков: 7990010 Число свободных блоков, доступных непривилегированным процессам: 7027115 Общее число описателей файлов: 9633792 Общее число свободных описателей файлов: 8259049 Число описателей файлов, доступных непривилегированным процессам: 8259049 Идентификатор файловой системы: 0 Битная шкала флагов: 0 Максимальная длина имени файла: 255
statvfs-информация о файловой системе, содержащей файл /a: Размер блока файловой системы: 512 Базовый размер блока файловой системы: 512 Общее число блоков базового размера в файловой системе: 2847 Общее число свободных блоков: 1960 Число свободных блоков, доступных непривилегированным процессам: 1960 Общее число описателей файлов: 0 Общее число свободных описателей файлов: 0 Число описателей файлов, доступных непривилегированным процессам: 0 Идентификатор файловой системы: 0 Битная шкала флагов: f Максимальная длина имени файла: 260
Листинг 4.20. Возможный результат работы программы, использующей функцию statvfs().
Закрыть окно




1428 /usr/local/man/man1 12 /usr/local/man/man5 64 /usr/local/man/man7 36 /usr/local/man/man8 1544 /usr/local/man 384 /bin/vi 0 /bin/view
Листинг 4.21. Возможный результат использования утилиты du.
Закрыть окно




cd "$OLDPWD" && pwd
Листинг 4.22. Действия, выполняемые по команде cd -.
Закрыть окно




ls -dl /usr/tmp /var/tmp cd /usr/ tmp pwd pwd -P cd .. pwd cd - cd -P .. pwd
Пример 4.23. Пример выполнения команды cd с разными опциями
Закрыть окно




lrwxrwxrwx 1 root root 10 Jul 6 14:16 /usr/tmp -> ../var/tmp drwxrwxrwt 5 root root 4096 Sep 4 18:05 /var/tmp /usr/tmp /var/tmp /usr /usr/tmp /var
Пример 4.24. результат выполнения команд cd с разными опциями
Закрыть окно




#include <unistd.h> int chown (const char *path, uid_t owner, gid_t group); #include <unistd.h> int fchown ( int fildes, uid_t owner, gid_t group); #include <sys/stat.h> int chmod (const char *path, mode_t mode); #include <sys/stat.h> int fchmod (int fildes, mode_t mode);
Листинг 4.25. Описание функций chown(), fchown(), chmod() и fchmod().
Закрыть окно




chmod go-w,u+ x myfile
Листинг 4.26. Пример использования служебной программы chmod.
Закрыть окно




#include <sys/types.h> #include <sys/stat.h> #include <stdio.h> /* Программа добавляет права на выполнение для файлов - аргументов командной строки */ int main (int argc, char *argv[]) { struct stat buf; int i;
for (i = 1; i < argc; i++) { if (stat (argv [i], &buf)) { fprintf (stderr, "\nstat: не удалось получить информацию о файле %s\n", argv [i]); return (-1); }
if (chmod (argv [i], buf.st_mode | S_IXUSR | S_IXGRP | S_IXOTH)) { fprintf (stderr, "\nchmod: не удалось изменить режим доступа к файлу %s\n", argv [i]); return (-1); } }
return 0; }
Листинг 4.27. использования функций stat() и chmod().
Закрыть окно




> /var/run/utmp touch /var/log/wtmp chown :utmp /var/run/utmp /var/log/wtmp chmod ug=rw,o=r /var/run/utmp /var/log/wtmp
Листинг 4.28. использования совместного утилит touch, chown и chmod.
Закрыть окно




start () { echo -n " Starting cupsd: " daemon cupsd RETVAL=$? echo [ $RETVAL = 0 ] && touch /var/lock/subsys/cups return $RETVAL }
Листинг 4.29. Пример использования утилиты touch для работы с файлами-замками при загрузке ОС Linux.
Закрыть окно




#include <fcntl.h> int creat (const char *path, mode_t mode);
Листинг 4.30. Описание функции creat().
Закрыть окно




#include <stdio.h> void perror (const char *s);
Листинг 4.31. Описание функции perror().
Закрыть окно




#include <fcntl.h> #include <errno.h> #include <stdio.h> #include <limits.h> /* Программа пытается создавать в текущем */ /* каталоге файлы с именами g1, g2, ..., */ /* пока эти попытки не закончатся неудачей */ int main (void) { int n = 0; char name [PATH_MAX]; do sprintf (name, "g%d", ++n); while (creat (name, (mode_t) 0) >= 0); perror ("CREAT failed"); fprintf (stderr, "errno = %d\n", errno); fprintf (stderr, "Неудача на файле номер %d\n", n); return 0; }
Листинг 4.32. Пример программы, использующей функции creat() и perror().
Закрыть окно




CREAT failed: Too many open files errno = 24 Неудача на файле номер 1022
Листинг 4.33. Возможный результат первого выполнения программы, использующей функции creat() и perror().
Закрыть окно




CREAT failed: Permission denied errno = 22 Неудача на файле номер 1
Листинг 4.34. Результат повторного выполнения программы, использующей функции creat() и perror().
Закрыть окно




df = creat ("/tmp/sample", S_IRWXU | S_IRWXG | S_IRWXO);
Листинг 4.35. Пример вызова функции creat().
Закрыть окно




mkdir -p work/tmp/save
Листинг 4.36. Пример использования служебной программы mkdir для создания цепочки каталогов.
Закрыть окно




#include <sys/stat.h> int mkfifo (const char *path, mode_t mode);
Листинг 4.37. Описание функции mkfifo().
Закрыть окно




#include <unistd.h> int link (const char *source_path, const char *target_path); #include <unistd.h> int symlink (const char *link_contents, const char *link_name);
Листинг 4.38. Описание функций link() и symlink().
Закрыть окно




if [ -n "$mver" ]; then ln -sf /lib/modules/$mver\ /lib/modules/default fi
Листинг 4.39. Использование утилиты ln для формирования содержимого символьной ссылки
Закрыть окно




#include <unistd.h> int unlink (const char *path); #include <unistd.h> int rmdir (const char *path); #include <stdio.h> int remove (const char *path);
Листинг 4.40. Описание функций unlink(), rmdir() и remove().
Закрыть окно




rm -p a/b
Листинг 4.41. Пример команды удаления цепочки каталогов.
Закрыть окно




#include <unistd.h> #include <sys/types.h> #include <stdio.h> #include <sys/stat.h> /* Программа выполняет обработку */ /* с осторожным замещением */ /* основного файла рабочим */ #define MAIN_FILE "/home/galat/garb/temp/mfile" #define OLD_FILE "/home/galat/garb/temp/ofile" #define WORK_FILE "/home/galat/garb/temp/wfile" int main (void) { /* Необходимые описания */ /* . . . */ int work_success = 1;
/* Выполнение операций над рабочим файлом */ /* . . . */
/* В случае неудачи выдадим диагностическое сообщение и удалим рабочий файл */ if (! work_success) { fprintf (stderr, "\nНеудачное завершение операций над рабочим файлом %s\n", WORK_FILE); unlink (WORK_FILE); return (-1); }
/* Установим режим доступа к рабочему файлу, */ /* подходящие для последующего использования */ /* Пусть, например, это будет доступ для всех */ /* только на чтение */ chmod (WORK_FILE, S_IRUSR | S_IRGRP | S_IROTH);
/* Удалим ранее сохраненную старую версию основного файла */ unlink (OLD_FILE);
/* Сохраним текущую версию основного файла */ if (link (MAIN_FILE, OLD_FILE)) { perror ("Не удалось сохранить текущую версию основного файла"); return (-1); }
/* Удалим текущую версию основного файла */ unlink (MAIN_FILE);
/* Сделаем рабочий файл основным */ if (link (WORK_FILE, MAIN_FILE)) { perror ("Не удалось сделать рабочий файл основным"); /* Восстановим основной файл */ link (OLD_FILE, MAIN_FILE); return (-1); }
/* Удалим рабочий файл */ unlink (WORK_FILE);
return 0; }
Листинг 4.42. Пример программы, использующей функции link() и unlink().
Закрыть окно




.: d1/ x y ./d1:
Листинг 4.43. Состояние текущего каталога перед перемещением файлов.
Закрыть окно




ls -RF mv x y d1 mv d1 d2 ls -RF
Листинг 4.44. Использование утилиты mv для перемещения файлов и файловых иерархий.
Закрыть окно




.: d2/ ./d2: x y
Листинг 4.45. Состояние текущего каталога после перемещения файлов.
Закрыть окно




cp -R d2 d1 cp -R d2 d1 ls -RF
Листинг 4.46. Применение утилиты cp для копирования файловых иерархий.
Закрыть окно




.: d1/ d2/ ./d1: d2/ x y ./d1/d2: x y ./d2: x y
Листинг 4.47. Результат использования утилиты cp для копирования файловых иерархий.
Закрыть окно




#include <stdio.h> int rename (const char *old_path, const char *new_path);
Листинг 4.48. Описание функции rename().
Закрыть окно




#include <stdlib.h> #include <stdio.h> # define OLD_DIR "d1/d2" #define NEW_DIR "d2" int main (void) { system ("rm -f " NEW_DIR "/*"); if (rename (OLD_DIR, NEW_DIR)) { perror ("RENAME failed"); return (-1); } system ("ls -RF"); return 0; }
Листинг 4.49. Пример использования функции rename() для переименования каталогов.
Закрыть окно




.: d1/ d2/ ./d1: x y ./d2: x y
Листинг 4.50. Состояние текущего каталога после переименования каталогов с помощью функции rename().
Закрыть окно




find . \( -size 0c -o -name \*.o -a -atime +30 \) -ok rm {} \;
Листинг 4.51. Еще один пример использования утилиты find.
Закрыть окно




find /mnt \( -nouser -o -nogroup \) -exec chown nobody:nobody {} \;
Листинг 4.52. Пример выявления и обработки файлов с неизвестными владельцем или владеющей группой.
Закрыть окно




find . - name skip -prune -o -print find . -print -name skip -prune
Листинг 4.53. Пример использования элементарного выражения -prune.
Закрыть окно




pax -w . mkdir new_dir pax -rw old_dir new_dir
Листинг 4.54. Пример использования служебной программы pax.
Закрыть окно



Содержание раздела