Описание функции
#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. |
Закрыть окно |