МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ЗВІТ
ДО ПРАКТИЧНОЇ РОБОТИ № 5
З КУРСУ “МЕРЕЖЕВІ ОПЕРАЦІЙНІ СИСТЕМИ”
на тему “ Загальне ознайомлення iз системними викликами операцiйної системи Linux ”
Львів – 2010
Мета роботи
Познайомитися iз повним набором системних викликiв операцiйної системи Linux та призначенням i синопсисом найвживанiших системних викликiв.
Повний список системних викликiв:
ОПИС
Системний виклик - це основний інтерфейс між додатком і ядром Лінакса. Перелік системних викликів Linux 2.4.17 складався з 1100 функцій, визначених в /usr/src/linux/include/asm-*/unistd.h.
_llseek(2), _newselect(2), _sysctl(2), accept(2),
access(2), acct(2), adjtimex(2), afs_syscall, alarm(2),
bdflush(2), bind(2), break, brk(2), cacheflush(2),
capget(2), capset(2), chdir(2), chmod(2), chown(2),
chown32, chroot(2), clone(2), close(2), connect(2),
creat(2), create_module(2), delete_module(2), dup(2),
dup2(2), execve(2), exit(2), fchdir(2), fchmod(2),
fchown(2), fchown32, fcntl(2), fcntl64, fdatasync(2),
flock(2), fork(2), fstat(2), fstat64, fstatfs(2),
fsync(2), ftime, ftruncate(2), ftruncate64, get_ker-
nel_syms(2), getcwd(2), getdents(2), getdents64, gete-
gid(2), getegid32, geteuid(2), geteuid32, getgid(2), get-
gid32, getgroups(2), getgroups32, getitimer(2), getpage-
size(2), getpeername(2), getpmsg, getpgid(2), getpgrp(2),
getpid(2), getppid(2), getpriority(2), getresgid(2),
getresgid32, getresuid(2), getresuid32, getrlimit(2),
getrusage(2), getsid(2), getsockname(2), getsockopt(2),
gettid, gettimeofday(2), getuid(2), getuid32, gtty, idle,
init_module(2), ioctl(2), ioperm(2), iopl(2), ipc(2),
kill(2), lchown(2), lchown32, link(2), listen(2), lock,
lseek(2), lstat(2), lstat64, madvise(2), mincore(2),
mkdir(2), mknod(2), mlock(2), mlockall(2), mmap(2), mod-
ify_ldt(2), mount(2), mprotect(2), mpx, mremap(2),
msync(2), munlock(2), munlockall(2), munmap(2),
nanosleep(2), nfsservctl(2), nice(2), oldfstat, oldlstat,
oldolduname, oldstat, oldumount, olduname, open(2),
pause(2), personality(2), phys, pipe(2), pivot_root(2),
poll(2), prctl(2), pread(2), prof, profil, ptrace(2),
putpmsg, pwrite(2), query_module(2), quotactl(2), read(2),
readahead, readdir(2), readlink(2), readv(2), reboot(2),
recv(2), recvfrom(2), recvmsg(2), rename(2), rmdir(2),
rt_sigaction, rt_sigpending, rt_sigprocmask, rt_sigqueue-
info, rt_sigreturn, rt_sigsuspend, rt_sigtimedwait,
sched_get_priority_max(2), sched_get_priority_min(2),
sched_getparam(2), sched_getscheduler(2),
sched_rr_get_interval(2), sched_setparam(2),
sched_setscheduler(2), sched_yield(2), security,
select(2), sendfile(2), send(2), sendmsg(2), sendto(2),
setdomainname(2), setfsgid(2), setfsgid32, setfsuid(2),
setfsuid32, setgid(2), setgid32, setgroups(2), set-
groups32, sethostname(2), setitimer(2), setpgid(2), set-
priority(2), setregid(2), setregid32, setresgid(2),
setresgid32, setresuid(2), setresuid32, setreuid(2),
setreuid32, setrlimit(2), setsid(2), setsockopt(2), set-
timeofday(2), setuid(2), setuid32, setup(2), sgetmask(2),
shutdown(2), sigaction(2), sigaltstack(2), signal(2), sig-
pending(2), sigprocmask(2), sigreturn(2), sigsuspend(2),
socket(2), socketcall(2), socketpair(2), ssetmask(2),
stat(2), stat64, statfs(2), stime(2), stty, swapoff(2),
swapon(2), symlink(2), sync(2), sysfs(2), sysinfo(2), sys-
log(2), time(2), times(2), truncate(2), truncate64,
ulimit, umask(2), umount(2), uname(2), unlink(2),
uselib(2), ustat(2), utime(2), vfork(2), vhangup(2),
vm86(2), vm86old, wait4(2), waitpid(2), write(2),
writev(2).
З наведеного переліку, 9 є застарілими, а саме getrlimit,oldfstat, oldlstat, oldolduname, oldstat, olduname, read-dir, select та vm86old (дивіться сторінку obsolete(2)), і 15 ще не втілено в стандартному ядрі; ними являються afs_syscall, break, ftime, getpmsg, gtty, idle, lock, mpx phys, prof, profil, putpmsg, security, stty та ulimit(дивіться unimplemented(2)). Однак, ftime(3), profil(3) та ulimit(3) існують як функції Стандартної бібліотеки.Місце phys зайнято, починаючи з 2.1.116, системним викликом umount, тож phys ніколи не буде реалізовано.Виклики getpmsg та putpmsg призначено для ядер з латкою для підтримки потоків, і можуть ніколи не попасти до стандартного ядра. Виклик security зарезервовано на майбутнє.Грубо кажучи, код, що належить пронумерованому системному викликові __NR_xxx, зазначеному в /usr/include/asm/unistd.h, відповідає той, що можна знайтиу вихідному тексті ядра як функцію sys_xxx(). (Відправну таблицю для i386 можна знайти в /usr/src/linux/arch/i386/kernel/entry.S). Проте існує багато винятків, головним чином з-за того, що старші системні виклики замінено на нові, але це робилося без належної систематичності. На платформах з пропрієтарною емуляцією операційної системи, таких як parisc, sparc, sparc64 й alpha, існує багато додаткових системних викликів; mips64 також включає повний набір 32-бітних викликів. А далі, подробиці щодо Linux 2.4.17.
Визначення __NR_oldstat і __NR_stat стосуються функцій sys_stat() та sys_newstat(), так само як fstat та lstat. Аналогічно, визначення __NR_oldolduname, __NR_olduname та __NR_uname призначено для функцій sys_olduname(),sys_uname() та sys_newuname(). Таким чином, __NR_stat та __NR_uname завжди посилалися на найостаннішу версію системного виклику, тоді як решта існують для оберненої сумісності.
Інакша справа з select та mmap. Вони беруть п'ятьпараметрів, і створювали проблеми із тим як відбувається передача параметрів у i386. Таким чином, якщо на інших системах sys_select() та sys_mmap() відповідають __NR_select та __NR_mmap, то на i386 можна натомість знайти old_select() та old_mmap() (функції, в яких вживається покажчик на блок параметрів). На сьогодення, передача п'яти параметрів не викликає більше ускладнень, тому існують __NR__newselect (використовуваний в libc 6), що відповідає безпосередньо sys_select(), і, відповідно,__NR_mmap2.
Інші нумеровані системні виклики, __NR__llseek та __NR__sysctl, не включають додаткового твердого пробілу в sys_llseek() й sys_sysctl().Також існує __NR_readdir, що відповідає old_readdir(),функції, що читає, щонайбільше один каталог за раз, і яку замінив системний виклик sys_getdents().
На багатьох платформах, i386 - включно, виклики, щостосуються сокетів, ущільнено за допомогою socketcall(), а IPC-виклики (виклики міжпроцесної взаємодії) System V – за допомогою ipc().
На нових платформах, що включають тільки 64-бітний доступ до файлів, і 32-бітні користувацькі ID (uid) (тобто, таких як alpha, ia64, s390x), виклики, чия назва закінчується на *64 або *32, відсутні. Там де виклики з *64 або *32 існують, інші версії вважатимуться застарілими.
Системні виклики chown та lchown було поміняно в 2.1.81.Також було додано *64 і *32-версії до ядра 2.4, так само як нові версії getrlimit і mmap, а також нові виклики pivot_root, mincore, madvise, security, gettid і reada-head.
Групи:
ввiд-вивiд файлiв;
_llseek(2), close(2), creat(2), dup(2), link(2), lseek(2)
робота з каталогами;
chdir(2), chroot(2), fchdir(2), mkdir(2)
керування пам'яттю;
brk(2), fdatasync(2), fsync(2), ftruncate(2), rename(2), sync(2)
робота з процесами (створення, завершення, тощо);
execve(2), exit(2), flock(2), fork(2),
диспетчерування процесiв;
acct(2), getpid(2), getppid(2), nice(2), vfork(2)
засоби мiжпроцесних комунiкацiй;
mount(2), pipe(2), umount(2), uselib(2), vfork(2)
робота з мережею;
accept(2), bind(2), connect(2), getpeername(2), getsockname(2), getsockopt(2), send(2)
засоби роботи iз сигналами;
kill(2), pause(2), poll(2), signal(2) sig- pending(2)
служба часу;
acct(2), alarm(2), time(2), times(2), utime(2)
засоби видачi iнформацiї про операцiйну систему;
sysctl(2), fstat(2), fstatfs(2), gete-gid(2), geteuid(2), statfs(2)
забезпечення роботи iз модулями.
ioctl(2), ioperm(2), vhangup(2)
3.Призначення системних викликiв:
_llseek(2) - змінює відносне положення читання/запису у файлі
close(2) -закриває дескриптор файла
creat(2)- відкриває і, по можливості, створює файл або пристрій
dup(2) - дублює дескриптор файла
link(2) - створює нову назву для файла
lseek(2) - переміщує позицію читання/запису файла
chdir(2) - змінює робочий каталог
chroot(2) - змінює кореневий каталог
fchdir(2) - змінює робочий каталог
mkdir(2) - створює каталог
brk(2) - змінює розмір сегменту даних
fdatasync(2) fsync(2)- синхронізують стан файла в пам'яті із тим, що на диску
ftruncate(2) - стинає файл до вказаної довжини
rename(2) - змінює назву і місцеположення файла
sync(2) - фіксує буферний кеш на диску
execve(2) - виконує програму
exit(2) - завершує роботу програми
flock(2) - застосовує дорадче замкнення відкритого файла
fork(2) - створює процес-нащадок.
acct(2) - вмикає та вимикає облік процесів
getpid(2) getppid(2) - добуття ідентифікаційного номера процесу
nice(2) - змінює пріоритет процесу
vfork(2) - створює дочірній процес і блокує батьківський
mount(2) umount(2)- монтаж та демонтаж файлових систем
pipe(2) - створює конвеєр
uselib(2) - призначає загальну бібліотеку
vfork(2) створює дочірній процес і блокує батьківський
accept(2) - приймає сполучення на сокеті
bind(2) - функція надання назви сокету
connect(2) - започатковує сполучення на сокеті
getpeername(2) - одержує ім'я сполученого сонета рівноправного вузла
getsockname(2) - добуває назву сокета
getsockopt(2) - добуває та задає опції сокета
send(2) - посилає повідомлення через сокет
kill(2) - надсилає сигнал процесу
pause(2) - очікування сигналу
poll(2) - очікує якоїсь події, що відбудеться на дескрипторі файла
signal(2) - обробка сигналів ANSI C
acct(2) - вмикає та вимикає облік процесів
alarm(2) - встановлює таймер для подачі сигналу тривоги
time(2) - повертає час у секундах
utime/s(2) - змінює час доступу і/або модифікаціїіндексного вузла
fstat(2) fstatfs(2)- добуття статусу файла
gete-gid(2) - добуває ідентифікатор групи
geteuid(2) добуває ідентичність користувача
statfs(2) - добуття статистики про файлову систему
ioctl(2) - керує пристроями
ioperm(2) - встановлює дозволи вводу-виводу портів
vhangup(2) - імітує завершення роботи на поточному терміна
stat - добуття статусу файла
struct stat {
dev_t st_dev; /* прилад */
ino_t st_ino; /* індексний номер */
mode_t st_mode; /* захист */
nlink_t st_nlink; /* кількість твердих посилань */
uid_t st_uid; /* користувацький ID власника */
gid_t st_gid; /* ID групи власника */
dev_t st_rdev; /* тип приладу */
off_t st_size; /* загальний розмір, в байтах */
blksize_t st_blksize; /* розмір блоку для операцій вводу/виводу */
blkcnt_t st_blocks; /* кількість виділених блоків */
time_t st_atime; /* час останнього доступу */
time_t st_mtime; /* час останньої модифікації */
time_t st_ctime; /* час останньої зміни статусу */
};
readdir(2) – зчитає дані каталога
ЗВЕДЕННЯ
#include <unistd.h>
#include <linux/dirent.h>
#include <linux/unistd.h>
_syscall3(int, readdir, uint, fd, struct dirent *, dirp, uint, count);
int readdir(unsigned int fd, struct dirent *dirp, unsigned int count);
ОПИС
Ця функція записує одну структуру dirent із каталогу,заданого fd, в область пам’яті, на яку вказує dirp. Параметр count майже завжди ігнорується і зчитується одна структура dirent.
Структура dirent визначена так:
struct dirent
{
long d_ino; /* номер inode */
off_t d_off; /* зміщення на dirent */
unsigned short d_reclen; /* довжина d_name */
char d_name [NAME_MAX+1]; /* і’мя файла */
}
d_ino - це номер inode. d_off - зміщення запису dirent від початку каталогу. d_reclen - довжина d_name (без кінцевого нуля). d_name – ім’я файла,яке закінчується нулем
Призначення системних викликiв перелiчених в пунктi 4:
open(2) - відкриває і, по можливості, створює файл або пристрій
create(2) - відкриває і, по можливості, створює файл або пристрій
read(2) - читає з дескриптора файла
write(2) - здійснює запис до дескриптора файла
close(2) - закриває дескриптор файла
umask(2) - встановлює маску створення файлів
stat(2) - добуття статусу файла
fstat(2) - добуття статусу файла
lstat(2) - добуття статусу файла
lseek(2) - переміщує позицію читання/запису файла
readdir(2) – отримати елемент каталогу по його дескриптору
getdents(2) – читання елементів із каталогу і перетворення в системно-незалежний формат.
fork(2) - створює процес-нащадок.
execve(2) - виконує програму
wait(2) –очікування завершення породженого процесу.
exit(2) - завершує роботу програми
kill(2) - надсилає сигнал процесу
Висновок
На даній лабораторній роботі я познайомився iз повним набором системних викликiв операцiйної системи Linux та призначенням i синопсисом найвживанiших системних викликiв.