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 ­ ptk­1)/(stk ­ stk­1))*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));