Проект реализует набор базовых Unix-утилит на языке C.
Каждая программа находится в отдельном .c-файле и собирается в отдельный исполняемый файл, полностью повторяя ключевое поведение оригинальных команд Linux.
Реализованы:
- echo — вывод аргументов, поддержка флага
-n - pwd — печать текущего каталога (
getcwd) - ls — вывод содержимого каталога (флаги
-l,-g,-R) - cp — копирование файлов (низкоуровневые
open/read/write, копирование прав) - wc — подсчёт строк, слов, символов
- cat — вывод содержимого файлов
Проект выполнен в рамках домашнего задания №4 курса «Практикум на ЭВМ 2025/2026».
Task_4/
│
├── echo.c # Реализация echo (-n)
├── pwd.c # getcwd + perror
├── ls.c # ls -l -g -R, long format, major/minor
├── cp.c # cp с проверкой cp f f, копирование прав
├── wc.c # wc: строки / слова / символы
└── cat.c # cat для нескольких файлов
Требуется GCC:
gcc echo.c -o echo
gcc pwd.c -o pwd
gcc ls.c -o ls
gcc cp.c -o cp
gcc wc.c -o wc
gcc cat.c -o cat./echo hello world
./echo -n "no newline"./pwd./ls
./ls -l
./ls -lg
./ls -lR dir./cp file copy
./cp f f # корректная ошибка: один и тот же файл./wc file.txt
./wc file1 file2./cat file.txt
./cat file1 file2- выводит аргументы через пробел;
- флаг
-nотключает перевод строки; - поведение соответствует POSIX-реализации.
- выводит абсолютный путь к текущему каталогу;
- использует
getcwd()и корректную обработку ошибок.
Поддерживаемые флаги:
| Флаг | Описание |
|---|---|
-l |
длинный формат (rwx, владелец, размер, тип файла) |
-g |
показывать группу владельца |
-R |
рекурсивный обход директорий |
Особенности:
- определение типа файла (
d,-,l,c,b,s); - вывод прав доступа (
rwxrwxrwx); - поддержка устройств через
major()иminor(); - поддержка символических ссылок (
readlink); - использование
opendir,readdir,lstat,getpwuid,getgrgid.
Полностью низкоуровневая реализация:
- чтение через
open(O_RDONLY)иread(); - запись через
open(O_CREAT|O_TRUNC)иwrite(); - копирование прав:
st_src.st_mode & 07777- защита от случая:
cp f f(проверка st_dev и st_ino);
- копирование внутрь каталога (
dir/file).
Считает:
- количество строк (
\n), - количество слов (по переходам
isspace), - количество символов (по всем прочитанным байтам).
Поддерживает ввод нескольких файлов.
- выводит содержимое файлов;
- поддерживает несколько аргументов;
- корректно обрабатывает ошибки открытия.