Programowanie w systemie Linux
Transkrypt
Programowanie w systemie Linux
Programowanie w systemie Linux Jacek Lach Zakład Oprogramowania Instytut Informatyki Politechnika Śląska Plan Jacek Lach. Programowanie w systemie Linux • /proc filesystem • Praca w trybie tekstowym • • • • • • • parametry wywołania Terminale znakowe Buforowane wejście / wyjście termios termcap terminfo ncurses System plików /proc Jacek Lach. Programowanie w systemie Linux • Interfejs do struktur jądra (proc(5)) 1 1055 1492 1929 425 728 933 driver loadavg self 1016 1081 1497 1930 427 8 938 execdomains locks slabinfo 1019 1085 1524 1931 497 808 939 fb mdstat stat 1022 1087 1526 1932 5 826 950 filesystems meminfo swaps 1024 1090 1575 1933 502 831 951 fs misc sys 1033 1112 1577 1934 559 867 961 ide modules sysvipc 1034 1113 1602 1935 573 9 apm interrupts mounts tty 1043 1114 1603 1946 6 927 asound iomem mtrr uptime 1046 115 1604 1948 603 928 bus ioports net version 1048 127 1605 1981 636 929 cmdline irq nv video 1049 128 1608 2 660 930 cpuinfo kcore partitions 1050 129 1804 3 691 931 devices kmsg pci 1052 1487 1806 4 710 932 dma ksyms scsi /proc • [liczba] Jacek Lach. Programowanie w systemie Linux • cmdline • cwd • environ • exe • fd • maps • mem • root • stat • statm Jacek Lach. Programowanie w systemie Linux /proc/PID/stat pid comm state ppid pgrp session tty_nr tpgid flags minflt cminflt majflt cmajflt utime stime cutimecstime priority nice 0 itrealvalue starttime vsize rss rlim startcode endcode startstack kstkesp kstkeip signalblocked sigignore sigcatch wchan nswap cnswap exit_signal processor /usr/src/linux/fs/proc/array.c /proc/self/stat Jacek Lach. Programowanie w systemie Linux 1997 (cat) R 1948 1997 1948 34820 1997 0 20 0 115 0 1 0 0 0 15 0 0 0 1057324 1650688 117 4294967295 134512640 134526036 3221223952 3221223560 1108192756 0 0 0 0 0 0 0 17 0 • • • • • • • PID Comm state ppid utime stime starttime Jacek Lach. Programowanie w systemie Linux /proc/stat cpu 36213 328 8818 1010664 cpu0 36213 328 8818 1010664 page 573809 218725 swap 1392 12835 intr 2304899 1056023 6328 0 0 0 11955 2 54214 0 0 900872 4288 [...] disk_io: (3,0):(82003,64945,1147618,17058,437450) ctxt 4949113 btime 1046946414 processes 1996 • • • • • • • • cpu user nice system idle page in out swap in out intr fromboot disk_io (maj:min):(noi, read_io, blkread, write_io, blkwrt) ctxt switch btime epoch processes forks /proc przykład Jacek Lach. Programowanie w systemie Linux • [1] /proc/PID/stat • [2] /proc/stat cpuk = ((ptk ptk1)/(stk stk1))*100 [%] • ptk czas działania procesu • stk czas istnienia w systemie * dla jednego procesora Parametry programu Jacek Lach. Programowanie w systemie Linux int main(int argc, char *argv[]) { ... } • Sposoby obsługi parametrów uruchomienia programu: • Przeglądanie “ręczne” • getopt(), getopt_long() • popt getopt(3) Jacek Lach. Programowanie w systemie Linux int getopt( int argc, char *argv[], const char *optstring); • przetwarza parametry wywołania programu • kolejne wywołania powodują przetworzenie kolejnego elementu parametrów • optstring: • • • • : wymaganie argumentu :: argument opcjonalny + POSIXLY_CORRECT parametry traktowane jako argumenty opcji Jacek Lach. Programowanie w systemie Linux getopt(3) while (1) { c = getopt(argc, argv, “abc:d:0”); if (c == -1) break; switch(c) { ... } } while (optind < argc) { dodatkowe parametry } getopt(3) Jacek Lach. Programowanie w systemie Linux run -0 -a -c 1 -beka -duko --ddr pierwszy drugi przebieg: 1 opcja 0 przebieg: 2 opcja a przebieg: 3 opcja c , wartosc: '1' przebieg: 4 opcja b przebieg: 5 run: invalid option -- e otrzymalem ? przebieg: 6 run: invalid option -- k otrzymalem ? przebieg: 7 opcja a przebieg: 8 opcja d , wartosc: 'uko' przebieg: 9 run: invalid option -- otrzymalem ? przebieg: 10 option d with value 'dr' przebieg: 11 elementy nie bedace opcjami: pierwszy drugi Jacek Lach. Programowanie w systemie Linux getopt_long(3) getopt_long(int argc, char *argv[], const char *optstring, const struct option *longopts, int *longindex); struct option { const char *name; int has_arg; int *flag; int val; }; getopt_long(3) getopt -add sos --add Jacek Lach. Programowanie w systemie Linux opcja a opcja d , wartosc: 'd' getopt: option `--add' requires an argument otrzymalem ? [ zmiana kolejnosci argv ] elementy nie bedace opcjami: sos Jacek Lach. Programowanie w systemie Linux Biblioteka popt • Umożliwia wielokrotne przeglądanie listy parametrów • Automatycznie generuje listę pomocy (help, usage) • Umożliwia tworzenie aliasów opcji Jacek Lach. Programowanie w systemie Linux popt(3) struct poptOption { const char *longName; char shortName; int argInfo; void *arg; int val; char *description; char *argDescription; }; Jacek Lach. Programowanie w systemie Linux popt(3) ./popt --help Usage: popt [OPTION...] -a, --add -s, --sub=argument_desc -m, --mul=integer_value Add extra info Del extra info Extra option Help options: -?, --help --usage Show this help message Display brief usage message Jacek Lach. Programowanie w systemie Linux Model sprzętowy System Superkomputer Interfejs szeregowy Terminal znakowy Tryb tekstowy Jacek Lach. Programowanie w systemie Linux • Buforowane wyjście • printf(), fprintf(), sprintf(), vprintf() ... • Buforowane wejście • scanf(), fscanf(), sscanf() termios Jacek Lach. Programowanie w systemie Linux • termios interfejs obsługi terminali • Modyfikacja parametrów: • • • • • wejście wyjście kontrola tryb lokalny specjalne znaki kontrolne Jacek Lach. Programowanie w systemie Linux termios struct termios { tcflag_t c_iflag; tcflag_t c_oflag; tcflag_t c_cflag; tcflag_t c_lflag; cc_t c_cc[NCCS]; }; int tcgetattr(int fd, struct termios *tios_p); int tcsetattr(int fd, int actions, struct termios *tios_p); akcje: • TCSANOW • TCSADRAIN • TCSAFLUSH termios input Jacek Lach. Programowanie w systemie Linux • Kontrola przetwarzania przed przekazaniem do programu • Makra: • • • • • • BRKINT IGNBRK ICRNL IGNCR INLCR ISTRIP termios output Jacek Lach. Programowanie w systemie Linux • Kontrola przetwarzania przed wysłaniem do portu • Makra: • • • • • ONLCR OCRNL ONLRET NLDLY CRDLY termios control Jacek Lach. Programowanie w systemie Linux • Kontrola sprzętowa terminala • Makra: • • • • • CS5 CS6 CS7 CS8 CSTOPB termios local Jacek Lach. Programowanie w systemie Linux • Kontrola zachowania terminala • Makra: • • • • ECHO ECHOE (BS SP BS) ECHONL ICANON termios specjalne znaki kontrolne Jacek Lach. Programowanie w systemie Linux • Kontrola zachowania przy otrzymaniu sekwencji specjalnej • Tryb kanoniczny: • VEOF • VEOL • VERASE • Tryb surowy: • VINTR • VMIN * • VTIME * * połączenie wartości umożliwia kontrolę pobierania znaków Jacek Lach. Programowanie w systemie Linux termios pozostałe funkcje • Kontrola szybkości linii • Oczekiwanie na zakończenie wysyłania znaków • Zatrzymanie wyprowadzania znaków • Opróżnianie bufora wejścia / wyjścia termios przykład Jacek Lach. Programowanie w systemie Linux struct termios init_set, new_set; char pass[32]; int infd = fileno(stdin); tcgetattr(infd, &init_set); new_set = init_set; new_set.c_lflag &= ~ECHO; printf("Podaj haslo: "); tcsetattr(infd, TCSAFLUSH, &new_set); fgets(pass, 32, stdin); tcsetattr(infd, TCSANOW, &init_set); new_set.c_lflag &= ~ECHO; new_set.c_lflag &= ~ISIG; new_set.c_lflag &= ~ICANON; new_set.c_cc[VMIN] = 1; new_set.c_cc[VTIME] = 0; Jacek Lach. Programowanie w systemie Linux terminfo • Baza danych opisujących terminale. • Charakterystykę terminala określają możliwości (capabilities): • • • • • • • • cols lines colors clear civis cnorm blink cup terminfo użycie • Inicjalizacja: Jacek Lach. Programowanie w systemie Linux int setupterm(char *term, int fd, int *errret); • Uzyskanie informacji o terminalu: int tigetflag(char *capname); int tigetnum(char *capname); char *tigetstr(char *capname); • Ustawianie parametrów: char *tparm(char *cap, long p1 ... long p9); • Wysyłanie sekwencji kontrolnej: int putp(const char *str); int tputs(const char *str, int affcnt, int (*putf)(int)); terminfo przykłady setupterm(NULL, 1, NULL); Jacek Lach. Programowanie w systemie Linux tigetnum(“lines”); tigetnum(“cols”); putp(tigetstr(“clear”)); putp(tparm(tigetstr("cup"), 10, 10));