├── README.md ├── sem6 ├── lab2 │ ├── test │ │ ├── file │ │ │ ├── 1 │ │ │ ├── 2 │ │ │ ├── 3 │ │ │ └── books │ │ │ │ ├── A │ │ │ │ ├── B │ │ │ │ └── C │ │ ├── file1 │ │ └── linkA │ ├── makefile │ └── src │ │ ├── color.h │ │ └── main.c ├── lab5 │ ├── src │ │ ├── out.txt │ │ ├── alphabet.txt │ │ ├── 2.c │ │ ├── 3.c │ │ ├── 2m.c │ │ ├── 3m.c │ │ ├── 1.c │ │ ├── 1m.c │ │ └── struct_io_file.c │ └── report │ │ ├── inc │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 1m.png │ │ ├── 2m.png │ │ ├── 3m.png │ │ ├── b_logo.jpg │ │ ├── scheme1.pdf │ │ ├── scheme2.pdf │ │ └── scheme3.pdf │ │ ├── report.pdf │ │ ├── report.tex │ │ ├── Makefile │ │ └── tex │ │ ├── title.tex │ │ ├── preamble.inc.tex │ │ └── lab.tex ├── lab3 │ ├── part1 │ │ ├── modules.order │ │ ├── run.sh │ │ ├── Makefile │ │ ├── md1.c │ │ └── md1.mod.c │ └── part2 │ │ ├── modules.order │ │ ├── md.h │ │ ├── Makefile │ │ ├── md3.c │ │ ├── md2.c │ │ ├── md1.mod.c │ │ ├── md3.mod.c │ │ ├── md2.mod.c │ │ ├── md1.c │ │ └── run.sh ├── lab6 │ ├── report │ │ ├── report.pdf │ │ ├── inc │ │ │ ├── b_logo.jpg │ │ │ ├── open.pdf │ │ │ ├── alloc_fd.pdf │ │ │ ├── do_last.pdf │ │ │ ├── lookup_open.pdf │ │ │ ├── nameidata.pdf │ │ │ ├── path_openat.pdf │ │ │ ├── getname_flags.pdf │ │ │ └── build_open_flags.pdf │ │ ├── report.tex │ │ ├── Makefile │ │ └── tex │ │ │ ├── title.tex │ │ │ ├── preamble.inc.tex │ │ │ └── lab.tex │ └── src │ │ ├── struct_open_flags.c │ │ ├── struct_filename.c │ │ └── struct_nameidata.c ├── lab8 │ ├── inet │ │ ├── Makefile │ │ ├── client.c │ │ └── server.c │ └── unix │ │ ├── Makefile │ │ ├── stream │ │ ├── Makefile │ │ ├── client.c │ │ └── server.c │ │ ├── socket.h │ │ ├── client.c │ │ └── server.c ├── lab7 │ ├── Makefile │ └── vfs.c ├── lab4 │ ├── part2 │ │ ├── Makefile │ │ ├── fortune.c │ │ └── seqfile.c │ ├── part1 │ │ ├── timer.c │ │ ├── stat.txt │ │ ├── const.h │ │ └── main.c │ └── README.md ├── lab9 │ ├── tasklet │ │ ├── Makefile │ │ └── tasklet.c │ └── workqueue │ │ ├── Makefile │ │ └── workq.c └── lab1 │ ├── makefile │ └── main.c ├── sem5 ├── lab3 │ └── report │ │ ├── report.toc │ │ ├── report.pdf │ │ ├── inc │ │ └── img │ │ │ ├── NI.png │ │ │ ├── b_logo.jpg │ │ │ ├── task1.png │ │ │ ├── task2-run.png │ │ │ ├── task2-zombie.png │ │ │ ├── task3-read.png │ │ │ ├── task3-write.png │ │ │ ├── task4-hardlink.png │ │ │ └── task4-softlink.png │ │ ├── report.tex │ │ ├── 20-conclusion.tex │ │ ├── 00-title.tex │ │ ├── preamble.inc.tex │ │ └── 10-impl.tex ├── lab5 │ ├── report │ │ ├── report.pdf │ │ ├── inc │ │ │ └── img │ │ │ │ ├── pc.png │ │ │ │ ├── rw.png │ │ │ │ └── b_logo.jpg │ │ ├── report.tex │ │ ├── Makefile │ │ ├── lab.tex │ │ ├── 00-title.tex │ │ └── preamble.inc.tex │ ├── pc │ │ ├── include │ │ │ ├── buffer.h │ │ │ └── runners.h │ │ ├── Makefile │ │ └── src │ │ │ ├── buffer.c │ │ │ ├── runners.c │ │ │ └── main.c │ └── rw │ │ ├── Makefile │ │ ├── include │ │ └── io.h │ │ └── src │ │ ├── main.c │ │ └── io.c ├── lab6 │ ├── report │ │ ├── report.pdf │ │ ├── inc │ │ │ └── img │ │ │ │ ├── rw.png │ │ │ │ └── b_logo.jpg │ │ ├── report.tex │ │ ├── Makefile │ │ ├── lab.tex │ │ ├── 00-title.tex │ │ └── preamble.inc.tex │ └── src │ │ ├── Makefile │ │ └── main.c ├── lab4 │ ├── report │ │ ├── inc │ │ │ └── img │ │ │ │ ├── 1.png │ │ │ │ ├── 2.png │ │ │ │ ├── 3.png │ │ │ │ ├── 4.png │ │ │ │ ├── 5_1.png │ │ │ │ ├── 5_2.png │ │ │ │ └── b_logo.jpg │ │ ├── report_lab4.pdf │ │ ├── report.tex │ │ ├── Makefile │ │ ├── 00-title.tex │ │ ├── lab.tex │ │ └── preamble.inc.tex │ └── src │ │ ├── 1.c │ │ ├── 2.c │ │ ├── 3.c │ │ ├── 4.c │ │ └── 5.c ├── lab1 │ ├── lab_01_1 │ │ ├── report │ │ │ ├── report.pdf │ │ │ ├── inc │ │ │ │ ├── img │ │ │ │ │ ├── sub_1.png │ │ │ │ │ ├── b_logo.jpg │ │ │ │ │ ├── int8h_1.png │ │ │ │ │ └── int8h_2.png │ │ │ │ └── src │ │ │ │ │ ├── sub_1.asm │ │ │ │ │ └── int8h.asm │ │ │ ├── report.tex │ │ │ ├── title.tex │ │ │ └── preamble.inc.tex │ │ └── int8h.drawio │ ├── lab_01_2 │ │ └── report │ │ │ ├── report.pdf │ │ │ ├── inc │ │ │ └── img │ │ │ │ ├── irql.png │ │ │ │ ├── b_logo.jpg │ │ │ │ └── priority.png │ │ │ ├── report.tex │ │ │ ├── report.toc │ │ │ ├── preamble.inc.tex │ │ │ └── 00-title.tex │ └── README.md └── lab2 │ └── src │ └── my_macro.inc ├── .gitattributes └── .gitignore /README.md: -------------------------------------------------------------------------------- 1 | # bmstu-os -------------------------------------------------------------------------------- /sem6/lab2/test/file/1: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sem6/lab2/test/file/2: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sem6/lab2/test/file/3: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sem6/lab2/test/file1: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sem6/lab2/test/file/books/A: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sem6/lab2/test/file/books/B: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sem6/lab2/test/file/books/C: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sem6/lab2/test/linkA: -------------------------------------------------------------------------------- 1 | file/books/A -------------------------------------------------------------------------------- /sem6/lab5/src/out.txt: -------------------------------------------------------------------------------- 1 | acegikmoqsuwy -------------------------------------------------------------------------------- /sem6/lab5/src/alphabet.txt: -------------------------------------------------------------------------------- 1 | abcdefghijklmnopqrstuvwxyz -------------------------------------------------------------------------------- /sem5/lab3/report/report.toc: -------------------------------------------------------------------------------- 1 | \babel@toc {russian}{} 2 | -------------------------------------------------------------------------------- /sem6/lab3/part1/modules.order: -------------------------------------------------------------------------------- 1 | /root/bmstu/bmstu-os/sem6/lab3/part1/md1.ko 2 | -------------------------------------------------------------------------------- /sem6/lab5/report/inc/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem6/lab5/report/inc/1.png -------------------------------------------------------------------------------- /sem6/lab5/report/inc/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem6/lab5/report/inc/2.png -------------------------------------------------------------------------------- /sem6/lab5/report/inc/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem6/lab5/report/inc/3.png -------------------------------------------------------------------------------- /sem5/lab3/report/report.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab3/report/report.pdf -------------------------------------------------------------------------------- /sem5/lab5/report/report.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab5/report/report.pdf -------------------------------------------------------------------------------- /sem5/lab6/report/report.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab6/report/report.pdf -------------------------------------------------------------------------------- /sem6/lab5/report/inc/1m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem6/lab5/report/inc/1m.png -------------------------------------------------------------------------------- /sem6/lab5/report/inc/2m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem6/lab5/report/inc/2m.png -------------------------------------------------------------------------------- /sem6/lab5/report/inc/3m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem6/lab5/report/inc/3m.png -------------------------------------------------------------------------------- /sem6/lab5/report/report.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem6/lab5/report/report.pdf -------------------------------------------------------------------------------- /sem6/lab6/report/report.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem6/lab6/report/report.pdf -------------------------------------------------------------------------------- /sem5/lab3/report/inc/img/NI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab3/report/inc/img/NI.png -------------------------------------------------------------------------------- /sem5/lab4/report/inc/img/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab4/report/inc/img/1.png -------------------------------------------------------------------------------- /sem5/lab4/report/inc/img/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab4/report/inc/img/2.png -------------------------------------------------------------------------------- /sem5/lab4/report/inc/img/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab4/report/inc/img/3.png -------------------------------------------------------------------------------- /sem5/lab4/report/inc/img/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab4/report/inc/img/4.png -------------------------------------------------------------------------------- /sem5/lab5/report/inc/img/pc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab5/report/inc/img/pc.png -------------------------------------------------------------------------------- /sem5/lab5/report/inc/img/rw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab5/report/inc/img/rw.png -------------------------------------------------------------------------------- /sem5/lab6/report/inc/img/rw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab6/report/inc/img/rw.png -------------------------------------------------------------------------------- /sem6/lab5/report/inc/b_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem6/lab5/report/inc/b_logo.jpg -------------------------------------------------------------------------------- /sem6/lab6/report/inc/b_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem6/lab6/report/inc/b_logo.jpg -------------------------------------------------------------------------------- /sem6/lab6/report/inc/open.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem6/lab6/report/inc/open.pdf -------------------------------------------------------------------------------- /sem5/lab4/report/inc/img/5_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab4/report/inc/img/5_1.png -------------------------------------------------------------------------------- /sem5/lab4/report/inc/img/5_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab4/report/inc/img/5_2.png -------------------------------------------------------------------------------- /sem5/lab4/report/report_lab4.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab4/report/report_lab4.pdf -------------------------------------------------------------------------------- /sem6/lab5/report/inc/scheme1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem6/lab5/report/inc/scheme1.pdf -------------------------------------------------------------------------------- /sem6/lab5/report/inc/scheme2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem6/lab5/report/inc/scheme2.pdf -------------------------------------------------------------------------------- /sem6/lab5/report/inc/scheme3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem6/lab5/report/inc/scheme3.pdf -------------------------------------------------------------------------------- /sem6/lab6/report/inc/alloc_fd.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem6/lab6/report/inc/alloc_fd.pdf -------------------------------------------------------------------------------- /sem6/lab6/report/inc/do_last.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem6/lab6/report/inc/do_last.pdf -------------------------------------------------------------------------------- /sem5/lab1/lab_01_1/report/report.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab1/lab_01_1/report/report.pdf -------------------------------------------------------------------------------- /sem5/lab1/lab_01_2/report/report.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab1/lab_01_2/report/report.pdf -------------------------------------------------------------------------------- /sem5/lab3/report/inc/img/b_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab3/report/inc/img/b_logo.jpg -------------------------------------------------------------------------------- /sem5/lab3/report/inc/img/task1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab3/report/inc/img/task1.png -------------------------------------------------------------------------------- /sem5/lab4/report/inc/img/b_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab4/report/inc/img/b_logo.jpg -------------------------------------------------------------------------------- /sem5/lab5/report/inc/img/b_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab5/report/inc/img/b_logo.jpg -------------------------------------------------------------------------------- /sem5/lab6/report/inc/img/b_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab6/report/inc/img/b_logo.jpg -------------------------------------------------------------------------------- /sem6/lab6/report/inc/lookup_open.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem6/lab6/report/inc/lookup_open.pdf -------------------------------------------------------------------------------- /sem6/lab6/report/inc/nameidata.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem6/lab6/report/inc/nameidata.pdf -------------------------------------------------------------------------------- /sem6/lab6/report/inc/path_openat.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem6/lab6/report/inc/path_openat.pdf -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | 2 | */report/* linguist-documentation 3 | */*/report/* linguist-documentation 4 | *.tex linguist-documentation 5 | -------------------------------------------------------------------------------- /sem5/lab3/report/inc/img/task2-run.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab3/report/inc/img/task2-run.png -------------------------------------------------------------------------------- /sem6/lab6/report/inc/getname_flags.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem6/lab6/report/inc/getname_flags.pdf -------------------------------------------------------------------------------- /sem5/lab3/report/inc/img/task2-zombie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab3/report/inc/img/task2-zombie.png -------------------------------------------------------------------------------- /sem5/lab3/report/inc/img/task3-read.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab3/report/inc/img/task3-read.png -------------------------------------------------------------------------------- /sem5/lab3/report/inc/img/task3-write.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab3/report/inc/img/task3-write.png -------------------------------------------------------------------------------- /sem6/lab6/report/inc/build_open_flags.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem6/lab6/report/inc/build_open_flags.pdf -------------------------------------------------------------------------------- /sem5/lab1/lab_01_1/report/inc/img/sub_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab1/lab_01_1/report/inc/img/sub_1.png -------------------------------------------------------------------------------- /sem5/lab1/lab_01_2/report/inc/img/irql.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab1/lab_01_2/report/inc/img/irql.png -------------------------------------------------------------------------------- /sem5/lab3/report/inc/img/task4-hardlink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab3/report/inc/img/task4-hardlink.png -------------------------------------------------------------------------------- /sem5/lab3/report/inc/img/task4-softlink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab3/report/inc/img/task4-softlink.png -------------------------------------------------------------------------------- /sem5/lab1/lab_01_1/report/inc/img/b_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab1/lab_01_1/report/inc/img/b_logo.jpg -------------------------------------------------------------------------------- /sem5/lab1/lab_01_1/report/inc/img/int8h_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab1/lab_01_1/report/inc/img/int8h_1.png -------------------------------------------------------------------------------- /sem5/lab1/lab_01_1/report/inc/img/int8h_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab1/lab_01_1/report/inc/img/int8h_2.png -------------------------------------------------------------------------------- /sem5/lab1/lab_01_2/report/inc/img/b_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab1/lab_01_2/report/inc/img/b_logo.jpg -------------------------------------------------------------------------------- /sem5/lab1/lab_01_2/report/inc/img/priority.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOne/bmstu-os/HEAD/sem5/lab1/lab_01_2/report/inc/img/priority.png -------------------------------------------------------------------------------- /sem6/lab8/inet/Makefile: -------------------------------------------------------------------------------- 1 | CC = gcc 2 | 3 | .PHONY: all 4 | all: server.out client.out 5 | 6 | %.out: %.c 7 | $(CC) -o $@ $^ 8 | 9 | clean: 10 | rm -rf *.out -------------------------------------------------------------------------------- /sem6/lab3/part2/modules.order: -------------------------------------------------------------------------------- 1 | /root/bmstu/bmstu-os/sem6/lab3/part2/md1.ko 2 | /root/bmstu/bmstu-os/sem6/lab3/part2/md2.ko 3 | /root/bmstu/bmstu-os/sem6/lab3/part2/md3.ko 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode/ 2 | *.aux 3 | *.log 4 | *.gz 5 | *.out 6 | *.o 7 | *.exe 8 | *.d 9 | *.ko 10 | *.symvers 11 | *.mod 12 | *.orders 13 | *.cmd 14 | *.order 15 | *.mod.c -------------------------------------------------------------------------------- /sem6/lab8/unix/Makefile: -------------------------------------------------------------------------------- 1 | CC = gcc 2 | 3 | .PHONY: all 4 | all: server.out client.out 5 | 6 | %.out: %.c 7 | $(CC) -o $@ $^ 8 | 9 | clean: 10 | rm -rf *.out 11 | -------------------------------------------------------------------------------- /sem6/lab6/src/struct_open_flags.c: -------------------------------------------------------------------------------- 1 | struct open_flags { 2 | int open_flag; 3 | umode_t mode; 4 | int acc_mode; 5 | int intent; 6 | int lookup_flags; 7 | }; 8 | 9 | -------------------------------------------------------------------------------- /sem6/lab8/unix/stream/Makefile: -------------------------------------------------------------------------------- 1 | CC = gcc 2 | 3 | .PHONY: all 4 | all: server.out client.out 5 | 6 | %.out: %.c 7 | $(CC) -o $@ $^ 8 | 9 | clean: 10 | rm -rf *.out 11 | -------------------------------------------------------------------------------- /sem6/lab2/makefile: -------------------------------------------------------------------------------- 1 | .PHONY: clean 2 | 3 | normal: src/main.c 4 | cc src/main.c 5 | 6 | prikol: src/main.c 7 | cc src/main.c -D __RND_COLOR 8 | 9 | clean: 10 | rm -f a.out 11 | 12 | -------------------------------------------------------------------------------- /sem6/lab3/part2/md.h: -------------------------------------------------------------------------------- 1 | extern char* md1_data; 2 | extern int md1_fact(int); 3 | extern int md1_number; 4 | extern char* md1_proc(void); 5 | // extern char* md1_local(void); 6 | extern char* md1_noexport(void); 7 | -------------------------------------------------------------------------------- /sem5/lab3/report/report.tex: -------------------------------------------------------------------------------- 1 | \documentclass[a4paper,14pt, unknownkeysallowed]{extreport} 2 | 3 | \include{preamble.inc} 4 | 5 | \begin{document} 6 | 7 | \include{00-title} 8 | 9 | \include{10-impl} 10 | 11 | \end{document} 12 | -------------------------------------------------------------------------------- /sem5/lab1/lab_01_2/report/report.tex: -------------------------------------------------------------------------------- 1 | \documentclass[a4paper,14pt]{extreport} 2 | 3 | \include{preamble.inc} 4 | 5 | \begin{document} 6 | 7 | \include{00-title} 8 | 9 | \tableofcontents 10 | 11 | \include{lab} 12 | 13 | \end{document} 14 | -------------------------------------------------------------------------------- /sem6/lab6/src/struct_filename.c: -------------------------------------------------------------------------------- 1 | struct filename { 2 | const char *name; /* pointer to actual string */ 3 | const __user char *uptr; /* original userland pointer */ 4 | int refcnt; 5 | struct audit_names *aname; 6 | const char iname[]; 7 | }; 8 | 9 | -------------------------------------------------------------------------------- /sem5/lab3/report/20-conclusion.tex: -------------------------------------------------------------------------------- 1 | \section*{Заключение} 2 | 3 | Прерывание INT 8h отвечает за изменение счётчика системного времени и управление контроллером дисковода с целью минимизации времени работы дисковода, а также отвечает за периодически вызов пользовательского прерывания. -------------------------------------------------------------------------------- /sem5/lab4/report/report.tex: -------------------------------------------------------------------------------- 1 | \documentclass[a4paper,14pt, unknownkeysallowed]{extreport} 2 | 3 | \include{preamble.inc} 4 | 5 | \begin{document} 6 | 7 | \include{00-title} 8 | 9 | \pagenumbering{arabic} 10 | \setcounter{page}{2} 11 | 12 | \include{lab} 13 | 14 | \end{document} 15 | -------------------------------------------------------------------------------- /sem5/lab5/report/report.tex: -------------------------------------------------------------------------------- 1 | \documentclass[a4paper,14pt, unknownkeysallowed]{extreport} 2 | 3 | \include{preamble.inc} 4 | 5 | \begin{document} 6 | 7 | \include{00-title} 8 | 9 | \pagenumbering{arabic} 10 | \setcounter{page}{2} 11 | 12 | \include{lab} 13 | 14 | \end{document} 15 | -------------------------------------------------------------------------------- /sem5/lab6/report/report.tex: -------------------------------------------------------------------------------- 1 | \documentclass[a4paper,14pt, unknownkeysallowed]{extreport} 2 | 3 | \include{preamble.inc} 4 | 5 | \begin{document} 6 | 7 | \include{00-title} 8 | 9 | \pagenumbering{arabic} 10 | \setcounter{page}{2} 11 | 12 | \include{lab} 13 | 14 | \end{document} 15 | -------------------------------------------------------------------------------- /sem6/lab5/report/report.tex: -------------------------------------------------------------------------------- 1 | \documentclass[a4paper,14pt, unknownkeysallowed]{extreport} 2 | 3 | \include{tex/preamble.inc} 4 | 5 | \begin{document} 6 | 7 | \include{tex/title} 8 | 9 | \pagenumbering{arabic} 10 | \setcounter{page}{2} 11 | 12 | \include{tex/lab} 13 | 14 | \end{document} 15 | -------------------------------------------------------------------------------- /sem6/lab6/report/report.tex: -------------------------------------------------------------------------------- 1 | \documentclass[a4paper,14pt, unknownkeysallowed]{extreport} 2 | 3 | \include{tex/preamble.inc} 4 | 5 | \begin{document} 6 | 7 | \include{tex/title} 8 | 9 | \pagenumbering{arabic} 10 | \setcounter{page}{2} 11 | 12 | \include{tex/lab} 13 | 14 | \end{document} 15 | -------------------------------------------------------------------------------- /sem5/lab4/report/Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: report.pdf all clean 2 | 3 | all: report.pdf 4 | 5 | %.tex: %.raw 6 | ./raw2tex $< > $@ 7 | 8 | %.tex: %.dat 9 | ./dat2tex $< > $@ 10 | 11 | report.pdf: report.tex 12 | latexmk -pdf -pdflatex="pdflatex -interaction=nonstopmode" -use-make report.tex 13 | 14 | clean: 15 | latexmk -CA 16 | 17 | -------------------------------------------------------------------------------- /sem5/lab5/report/Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: report.pdf all clean 2 | 3 | all: report.pdf 4 | 5 | %.tex: %.raw 6 | ./raw2tex $< > $@ 7 | 8 | %.tex: %.dat 9 | ./dat2tex $< > $@ 10 | 11 | report.pdf: report.tex 12 | latexmk -pdf -pdflatex="pdflatex -interaction=nonstopmode" -use-make report.tex 13 | 14 | clean: 15 | latexmk -CA 16 | 17 | -------------------------------------------------------------------------------- /sem5/lab6/report/Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: report.pdf all clean 2 | 3 | all: report.pdf 4 | 5 | %.tex: %.raw 6 | ./raw2tex $< > $@ 7 | 8 | %.tex: %.dat 9 | ./dat2tex $< > $@ 10 | 11 | report.pdf: report.tex 12 | latexmk -pdf -pdflatex="pdflatex -interaction=nonstopmode" -use-make report.tex 13 | 14 | clean: 15 | latexmk -CA 16 | 17 | -------------------------------------------------------------------------------- /sem6/lab3/part1/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | make 3 | echo "*** Loading md1.ko..." 4 | echo 5 | sleep 1 6 | insmod md1.ko 7 | lsmod | grep md 8 | echo 9 | sleep 1 10 | echo "*** This is the last 15 lines in the system log: " 11 | dmesg | tail -15 12 | echo "*** Remove md1..." 13 | rmmod md1 14 | echo 15 | sleep 1 16 | dmesg | tail -15 17 | -------------------------------------------------------------------------------- /sem6/lab5/report/Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: report.pdf all clean 2 | 3 | all: report.pdf 4 | 5 | %.tex: %.raw 6 | ./raw2tex $< > $@ 7 | 8 | %.tex: %.dat 9 | ./dat2tex $< > $@ 10 | 11 | report.pdf: report.tex 12 | latexmk -pdf -pdflatex="pdflatex -interaction=nonstopmode" -use-make report.tex 13 | 14 | clean: 15 | latexmk -CA 16 | 17 | -------------------------------------------------------------------------------- /sem6/lab6/report/Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: report.pdf all clean 2 | 3 | all: report.pdf 4 | 5 | %.tex: %.raw 6 | ./raw2tex $< > $@ 7 | 8 | %.tex: %.dat 9 | ./dat2tex $< > $@ 10 | 11 | report.pdf: report.tex 12 | latexmk -pdf -pdflatex="pdflatex -interaction=nonstopmode" -use-make report.tex 13 | 14 | clean: 15 | latexmk -CA 16 | 17 | -------------------------------------------------------------------------------- /sem5/lab6/report/lab.tex: -------------------------------------------------------------------------------- 1 | \chapter*{Задача <<Читатели-Писатели>>} 2 | 3 | \section*{Листинги кода} 4 | 5 | \begin{lstinputlisting}[caption={Реализация задачи.},style={CStyle}]{../src/main.c} 6 | \end{lstinputlisting} 7 | 8 | \clearpage 9 | \section*{Работа программы} 10 | 11 | \img{165mm}{rw}{<<Читатели-Писатели>>. Максимальная задержка -- 3с.} 12 | 13 | 14 | -------------------------------------------------------------------------------- /sem6/lab7/Makefile: -------------------------------------------------------------------------------- 1 | VERSION = $(shell uname -r) 2 | KDIR = /lib/modules/$(VERSION)/build 3 | PWD = $(shell pwd) 4 | TARGET = vfs 5 | obj-m := $(TARGET).o 6 | default: 7 | $(MAKE) -C $(KDIR) M=$(PWD) modules 8 | clean: 9 | @rm -f *.o .*.cmd .*.flags *.mod.c *.order 10 | @rm -f .*.*.cmd *~ *.*~ TODO.* 11 | @rm -fR .tmp* 12 | @rm -rf .tmp_versions 13 | disclean: clean 14 | @rm -f *.ko *.symvers *.mod 15 | -------------------------------------------------------------------------------- /sem6/lab3/part1/Makefile: -------------------------------------------------------------------------------- 1 | VERSION = $(shell uname -r) 2 | KDIR = /lib/modules/$(VERSION)/build 3 | PWD = $(shell pwd) 4 | TARGET = md1 5 | obj-m := $(TARGET).o 6 | default: 7 | $(MAKE) -C $(KDIR) M=$(PWD) modules 8 | clean: 9 | @rm -f *.o .*.cmd .*.flags *.mod.c *.order 10 | @rm -f .*.*.cmd *~ *.*~ TODO.* 11 | @rm -fR .tmp* 12 | @rm -rf .tmp_versions 13 | disclean: clean 14 | @rm -f *.ko *.symvers *.mod 15 | -------------------------------------------------------------------------------- /sem6/lab4/part2/Makefile: -------------------------------------------------------------------------------- 1 | CURRENT = $(shell uname -r) 2 | KDIR = /lib/modules/$(CURRENT)/build 3 | PWD = $(shell pwd) 4 | TARGET1 = fortune 5 | TARGET2 = seqfile 6 | obj-m := $(TARGET1).o $(TARGET2).o 7 | default: 8 | $(MAKE) -C $(KDIR) M=$(PWD) modules 9 | clean: 10 | @rm -f *.o .*.cmd .*.flags *.mod.c *.order 11 | @rm -f .*.*.cmd *~ *.*~ TODO.* 12 | @rm -fR .tmp* 13 | @rm -rf .tmp_versions 14 | disclean: clean 15 | @rm -f *.ko *.symvers *.mod 16 | -------------------------------------------------------------------------------- /sem6/lab9/tasklet/Makefile: -------------------------------------------------------------------------------- 1 | ifneq ($(KERNELRELEASE),) 2 | obj-m := tasklet.o 3 | else 4 | CURRENT = $(shell uname -r) 5 | KDIR = /lib/modules/$(CURRENT)/build 6 | PWD = $(shell pwd) 7 | default: 8 | $(MAKE) -C $(KDIR) M=$(PWD) modules 9 | clean: 10 | @rm -f *.o .*.cmd .*.flags *.mod.c *.order 11 | @rm -f .*.*.cmd *~ *.*~ TODO.* 12 | @rm -fR .tmp* 13 | @rm -rf .tmp_versions 14 | disclean: clean 15 | @rm *.ko *.symvers 16 | 17 | endif -------------------------------------------------------------------------------- /sem6/lab9/workqueue/Makefile: -------------------------------------------------------------------------------- 1 | ifneq ($(KERNELRELEASE),) 2 | obj-m := workq.o 3 | else 4 | CURRENT = $(shell uname -r) 5 | KDIR = /lib/modules/$(CURRENT)/build 6 | PWD = $(shell pwd) 7 | default: 8 | $(MAKE) -C $(KDIR) M=$(PWD) modules 9 | clean: 10 | @rm -f *.o .*.cmd .*.flags *.mod.c *.order 11 | @rm -f .*.*.cmd *~ *.*~ TODO.* 12 | @rm -fR .tmp* 13 | @rm -rf .tmp_versions 14 | disclean: clean 15 | @rm *.ko *.symvers 16 | 17 | endif -------------------------------------------------------------------------------- /sem6/lab5/src/2.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #define FILENAME "alphabet.txt" 5 | 6 | int main() { 7 | char c; 8 | int fd1 = open(FILENAME, O_RDONLY); 9 | int fd2 = open(FILENAME, O_RDONLY); 10 | 11 | while (1) { 12 | if (read(fd1, &c, 1) != 1) break; 13 | write(1, &c, 1); 14 | 15 | if (read(fd2, &c, 1) != 1) break; 16 | write(1, &c, 1); 17 | } 18 | 19 | return 0; 20 | } 21 | -------------------------------------------------------------------------------- /sem6/lab4/part1/timer.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | int main(void) { 8 | time_t raw_time; 9 | struct tm *time_info; 10 | char buf[70]; 11 | 12 | while(1) 13 | { 14 | time(&raw_time); 15 | time_info = localtime(&raw_time); 16 | puts((asctime(time_info))); 17 | sleep(10); 18 | } 19 | 20 | return 0; 21 | } 22 | -------------------------------------------------------------------------------- /sem6/lab3/part2/Makefile: -------------------------------------------------------------------------------- 1 | CURRENT = $(shell uname -r) 2 | KDIR = /lib/modules/$(CURRENT)/build 3 | PWD = $(shell pwd) 4 | TARGET1 = md1 5 | TARGET2 = md2 6 | TARGET3 = md3 7 | obj-m := $(TARGET1).o $(TARGET2).o $(TARGET3).o 8 | default: 9 | $(MAKE) -C $(KDIR) M=$(PWD) modules 10 | clean: 11 | @rm -f *.o .*.cmd .*.flags *.mod.c *.order *.o.d 12 | @rm -f .*.*.cmd *~ *.*~ TODO.* 13 | @rm -fR .tmp* 14 | @rm -rf .tmp_versions 15 | disclean: clean 16 | @rm -f *.ko *.symvers *.mod 17 | -------------------------------------------------------------------------------- /sem6/lab1/makefile: -------------------------------------------------------------------------------- 1 | CC = gcc 2 | CFLAGS = -Wall -Werror -Wextra -pedantic -lpthread 3 | 4 | APP = main.out 5 | 6 | .PHONY: clean run kill 7 | 8 | $(APP): main.o 9 | $(CC) -o $@ $^ 10 | 11 | run: $(APP) 12 | sudo ./$(APP) 13 | 14 | kill: 15 | ps -C $(APP) -o pid= | xargs -- sudo kill 16 | 17 | log: 18 | tail -f /var/log/syslog 19 | 20 | %.o: %.c %.h 21 | $(CC) -o $@ $(CFLAGS) -c $< 22 | 23 | %.o: %.c 24 | $(CC) -o $@ $(CFALGS) -c $^ 25 | 26 | clean: 27 | rm -f *.o *.out 2>/dev/null 28 | -------------------------------------------------------------------------------- /sem6/lab5/src/3.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #define FILENAME "out.txt" 6 | 7 | int main() { 8 | FILE *f1 = fopen(FILENAME, "w"); 9 | FILE *f2 = fopen(FILENAME, "w"); 10 | 11 | for (char c = 'a'; c <= 'z'; c++) { 12 | if (c % 2) { 13 | fprintf(f1, "%c", c); 14 | } else { 15 | fprintf(f2, "%c", c); 16 | } 17 | } 18 | 19 | fclose(f2); 20 | fclose(f1); 21 | 22 | return 0; 23 | } 24 | -------------------------------------------------------------------------------- /sem5/lab5/pc/include/buffer.h: -------------------------------------------------------------------------------- 1 | #ifndef __BUFFER_H__ 2 | #define __BUFFER_H__ 3 | 4 | #include 5 | #include 6 | 7 | #define N 24 8 | 9 | typedef char data_t[N]; 10 | 11 | typedef struct { 12 | size_t rpos; 13 | size_t wpos; 14 | data_t data; 15 | } cycle_buff_t; 16 | 17 | int buff_init(cycle_buff_t *const buffer); 18 | int buff_write(cycle_buff_t *const buffer, const char c); 19 | int buff_read(cycle_buff_t *const buffer, char* const dst); 20 | 21 | #endif // __BUFFER_H__ 22 | -------------------------------------------------------------------------------- /sem5/lab6/src/Makefile: -------------------------------------------------------------------------------- 1 | # Компилятор 2 | CC := gcc 3 | MAIN_APP := app.exe 4 | .PHONY : clean all 5 | 6 | # Опции компиляции 7 | CFLAGS := -std=c99 -Wall -Werror -pedantic -pipe 8 | 9 | # Файловые зависимости 10 | HEADERS := include 11 | RELEASE_FILES := $(wildcard *.c) 12 | 13 | all : $(MAIN_APP) 14 | 15 | # Main app 16 | $(MAIN_APP) : $(patsubst %.c,%.o, $(RELEASE_FILES)) 17 | $(CC) $(CFLAGS) -I $(HEADERS) $^ -o $@ 18 | 19 | %.o : %.c 20 | $(CC) $(CFLAGS) -I $(HEADERS) -c -MD $< 21 | 22 | include $(wildcard *.d) 23 | 24 | clean : 25 | rm -f *.d *.o *.exe 26 | -------------------------------------------------------------------------------- /sem5/lab5/pc/Makefile: -------------------------------------------------------------------------------- 1 | # Компилятор 2 | CC := gcc 3 | MAIN_APP := app.exe 4 | .PHONY : clean all 5 | 6 | # Опции компиляции 7 | CFLAGS := -std=c99 -Wall -Werror -pedantic -pipe 8 | 9 | # Файловые зависимости 10 | HEADERS := include 11 | RELEASE_FILES := $(wildcard src/*.c) 12 | 13 | all : $(MAIN_APP) 14 | 15 | # Main app 16 | $(MAIN_APP) : $(patsubst src/%.c,%.o, $(RELEASE_FILES)) 17 | $(CC) $(CFLAGS) -I $(HEADERS) $^ -o $@ 18 | 19 | %.o : src/%.c 20 | $(CC) $(CFLAGS) -I $(HEADERS) -c -MD $< 21 | 22 | include $(wildcard *.d) 23 | 24 | clean : 25 | rm -f *.d *.o *.exe 26 | -------------------------------------------------------------------------------- /sem5/lab5/rw/Makefile: -------------------------------------------------------------------------------- 1 | # Компилятор 2 | CC := gcc 3 | MAIN_APP := app.exe 4 | .PHONY : clean all 5 | 6 | # Опции компиляции 7 | CFLAGS := -std=c99 -Wall -Werror -pedantic -pipe 8 | 9 | # Файловые зависимости 10 | HEADERS := include 11 | RELEASE_FILES := $(wildcard src/*.c) 12 | 13 | all : $(MAIN_APP) 14 | 15 | # Main app 16 | $(MAIN_APP) : $(patsubst src/%.c,%.o, $(RELEASE_FILES)) 17 | $(CC) $(CFLAGS) -I $(HEADERS) $^ -o $@ 18 | 19 | %.o : src/%.c 20 | $(CC) $(CFLAGS) -I $(HEADERS) -c -MD $< 21 | 22 | include $(wildcard *.d) 23 | 24 | clean : 25 | rm -f *.d *.o *.exe 26 | -------------------------------------------------------------------------------- /sem5/lab5/rw/include/io.h: -------------------------------------------------------------------------------- 1 | #ifndef __IO_H__ 2 | #define __IO_H__ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #define ITERATIONS 20 11 | #define WRITERS_COUNT 3 12 | #define READERS_COUNT 5 13 | 14 | #define MAX_SEMS 4 15 | #define READER 0 16 | #define WRITER 1 17 | 18 | #define READ_QUEUE 2 19 | #define WRITE_QUEUE 3 20 | 21 | #define MAX_RANDOM 3 22 | 23 | int reader_run(int *const shared_counter, const int sid, const int reader_id); 24 | int writer_run(int *const shared_counter, const int sid, const int writer_id); 25 | 26 | #endif // __IO_H__ 27 | -------------------------------------------------------------------------------- /sem5/lab5/pc/include/runners.h: -------------------------------------------------------------------------------- 1 | #ifndef __RUNNERS_H__ 2 | #define __RUNNERS_H__ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | #include "buffer.h" 10 | 11 | #define ITERATIONS_AMOUNT 8 12 | 13 | #define CONS_COUNT 3 14 | #define PROD_COUNT 3 15 | 16 | #define BIN_SEM 0 17 | #define BUF_FULL 1 18 | #define BUF_EMPTY 2 19 | 20 | #define MAX_RANDOM_PROD 2 21 | #define MAX_RANDOM_CONS 5 22 | 23 | int run_producer(cycle_buff_t *const buffer, const int sid, const int prod_id); 24 | int run_consumer(cycle_buff_t *const buffer, const int sid, const int cons_id); 25 | 26 | #endif // __RUNNERS_H__ -------------------------------------------------------------------------------- /sem6/lab8/unix/socket.h: -------------------------------------------------------------------------------- 1 | #ifndef _SOCKET_H_ 2 | #define _SOCKET_H_ 3 | 4 | #define SOCK_NAME "socket.soc" 5 | #define SOCK_NAME_CLIENT "socket_c.soc" 6 | 7 | #define MAX_MSG_LEN 128 8 | #define MAX_LEN_ERR_MSG 256 9 | 10 | #define LEN_STRUCT_SOCKADDR(a) strlen(a.sa_data) + sizeof(a.sa_family) 11 | 12 | #define RED "\33[31m" 13 | #define GREEN "\33[32m" 14 | #define YELLOW "\33[33m" 15 | #define BLUE "\33[34m" 16 | #define WHITE "\33[37m" 17 | 18 | #define TRUE 1 19 | #define FALSE 0 20 | 21 | #define OK 0 22 | 23 | #define ERROR_CREATE_SOCKET 1 24 | #define ERROR_BIND_SOCKET 2 25 | #define ERROR_RECVFROM_SOCKET 3 26 | #define ERROR_SENDTO_SOCKET 4 27 | 28 | #endif -------------------------------------------------------------------------------- /sem5/lab5/pc/src/buffer.c: -------------------------------------------------------------------------------- 1 | #include "buffer.h" 2 | 3 | int buff_init(cycle_buff_t *const buffer) { 4 | if (!buffer) { 5 | return -1; 6 | } 7 | memset(buffer, 0, sizeof(cycle_buff_t)); 8 | 9 | return 0; 10 | } 11 | 12 | int buff_write(cycle_buff_t *const buffer, const char c) { 13 | if (!buffer) { 14 | return -1; 15 | } 16 | buffer->data[buffer->wpos++] = c; 17 | buffer->wpos %= N; 18 | 19 | return 0; 20 | } 21 | 22 | int buff_read(cycle_buff_t *const buffer, char *const dst) { 23 | if (!buffer) { 24 | return -1; 25 | } 26 | *dst = buffer->data[buffer->rpos++]; 27 | buffer->rpos %= N; 28 | 29 | return 0; 30 | } 31 | -------------------------------------------------------------------------------- /sem6/lab5/src/2m.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #define FILENAME "alphabet.txt" 6 | 7 | void *run(void *args) { 8 | int fd = open(FILENAME, O_RDONLY); 9 | int flag = 1; 10 | char c; 11 | while ((flag = read(fd, &c, 1)) == 1) { 12 | write(1, &c, 1); 13 | } 14 | return NULL; 15 | } 16 | 17 | int main() { 18 | int fd1 = open(FILENAME, O_RDONLY); 19 | pthread_t td; 20 | pthread_create(&td, NULL, run, NULL); 21 | 22 | int flag = 1; 23 | char c; 24 | while ((flag = read(fd1, &c, 1)) == 1) { 25 | write(1, &c, 1); 26 | } 27 | 28 | pthread_join(td, NULL); 29 | 30 | return 0; 31 | } 32 | -------------------------------------------------------------------------------- /sem6/lab5/src/3m.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | #define FILENAME "out.txt" 7 | 8 | void *run(void *args) { 9 | FILE *f = fopen(FILENAME, "w"); 10 | 11 | for (char c = 'b'; c <= 'z'; c += 2) { 12 | fprintf(f, "%c", c); 13 | } 14 | 15 | fclose(f); 16 | 17 | return NULL; 18 | } 19 | 20 | int main() { 21 | FILE *f1 = fopen(FILENAME, "w"); 22 | 23 | pthread_t td; 24 | pthread_create(&td, NULL, run, NULL); 25 | 26 | for (char c = 'a'; c <= 'z'; c += 2) { 27 | fprintf(f1, "%c", c); 28 | } 29 | 30 | pthread_join(td, NULL); 31 | fclose(f1); 32 | 33 | return 0; 34 | } 35 | -------------------------------------------------------------------------------- /sem6/lab3/part2/md3.c: -------------------------------------------------------------------------------- 1 | #include "md.h" 2 | #include 3 | #include 4 | 5 | MODULE_LICENSE("GPL"); 6 | MODULE_AUTHOR("Bogachenko Artem"); 7 | 8 | static int __init md_init(void) 9 | { 10 | printk("+ module md3 start!\n"); 11 | printk("+ data string exported from md1 : %s\n", md1_data); 12 | printk("+ string returned md1_proc() is : %s\n", md1_proc()); 13 | printk("+ data number exported from md1 : %d\n", md1_number); 14 | printk("+ md1_fact(5) call returns : %d\n", md1_fact(5)); 15 | // printk("+ md3 use local md1: %s\n", md1_local()); 16 | // printk("+ md3 string returned md1_noexport() is : %s\n", md1_noexport()); 17 | 18 | return 0; 19 | } 20 | 21 | module_init(md_init); 22 | -------------------------------------------------------------------------------- /sem6/lab6/src/struct_nameidata.c: -------------------------------------------------------------------------------- 1 | #define EMBEDDED_LEVELS 2 2 | struct nameidata { 3 | struct path path; 4 | struct qstr last; 5 | struct path root; 6 | struct inode *inode; /* path.dentry.d_inode */ 7 | unsigned int flags, state; 8 | unsigned seq, m_seq, r_seq; 9 | int last_type; 10 | unsigned depth; 11 | int total_link_count; 12 | struct saved { 13 | struct path link; 14 | struct delayed_call done; 15 | const char *name; 16 | unsigned seq; 17 | } *stack, internal[EMBEDDED_LEVELS]; 18 | struct filename *name; 19 | struct nameidata *saved; 20 | unsigned root_seq; 21 | int dfd; 22 | kuid_t dir_uid; 23 | umode_t dir_mode; 24 | } __randomize_layout; 25 | 26 | -------------------------------------------------------------------------------- /sem6/lab5/src/1.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #define BUF_SIZE 20 5 | #define FILENAME "alphabet.txt" 6 | 7 | int main() { 8 | int fd = open(FILENAME, O_RDONLY); 9 | 10 | FILE* fs1 = fdopen(fd, "r"); 11 | char buff1[BUF_SIZE]; 12 | setvbuf(fs1, buff1, _IOFBF, BUF_SIZE); 13 | 14 | FILE* fs2 = fdopen(fd, "r"); 15 | char buff2[BUF_SIZE]; 16 | setvbuf(fs2, buff2, _IOFBF, BUF_SIZE); 17 | 18 | int flag1 = 1, flag2 = 1; 19 | while (flag1 == 1 || flag2 == 1) { 20 | char c; 21 | flag1 = fscanf(fs1, "%c", &c); 22 | if (flag1 == 1) fprintf(stdout, "%c", c); 23 | 24 | flag2 = fscanf(fs2, "%c", &c); 25 | if (flag2 == 1) fprintf(stdout, "%c", c); 26 | } 27 | 28 | return 0; 29 | } 30 | -------------------------------------------------------------------------------- /sem5/lab1/lab_01_1/report/report.tex: -------------------------------------------------------------------------------- 1 | \documentclass[a4paper,12pt]{article} 2 | 3 | \include{preamble.inc} 4 | 5 | \setcounter{tocdepth}{4} 6 | \righthyphenmin = 2 7 | \tolerance = 2048 8 | 9 | \begin{document} 10 | \include{title} 11 | 12 | \specsection{Листинг обработчика INT 8h} 13 | 14 | \lstinputlisting[style={asm}]{inc/src/int8h.asm} 15 | 16 | \specsection{Листинг процедуры sub\_1} 17 | 18 | \lstinputlisting[style={asm}]{inc/src/sub_1.asm} 19 | 20 | \pagebreak 21 | 22 | \specsection{Схема алгоритма обработчика INT 8h} 23 | 24 | \includegraphics[height=230mm]{inc/img/int8h_1} 25 | 26 | \includegraphics{inc/img/int8h_2} 27 | 28 | \specsection{Схема алгоритма процедуры sub\_1} 29 | 30 | \includegraphics{inc/img/sub_1} 31 | 32 | 33 | %\lstinputlisting[style={asm}]{inc/src/sub_1.asm} 34 | 35 | \end{document} 36 | -------------------------------------------------------------------------------- /sem6/lab3/part1/md1.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | MODULE_LICENSE("GPL"); 8 | MODULE_AUTHOR("Bogachenko Artem"); 9 | 10 | static int __init md_init(void) 11 | { 12 | printk("_ md was loaded\n"); 13 | struct task_struct *task = &init_task; 14 | do { 15 | printk(KERN_INFO "_ %s - %d, %s - %d\n", task->comm, task->pid, task->parent->comm, task->parent->pid); 16 | } while ((task = next_task(task)) != &init_task); 17 | printk("_ %s - %d, %s - %d\n", current->comm, current->pid, current->parent->comm, current->parent->pid); 18 | printk("_ done work"); 19 | return 0; 20 | } 21 | static void __exit md_exit(void) 22 | { 23 | printk("_ md1 Good bye!\n"); 24 | } 25 | 26 | module_init(md_init); 27 | module_exit(md_exit); 28 | -------------------------------------------------------------------------------- /sem6/lab4/README.md: -------------------------------------------------------------------------------- 1 | ## Part 1 2 | 3 | Просят показать разделЫ TASKS и MAPS и сказать, что в MAPS мы видим адресса выделенные для программы, библиотек и прочего 4 | 5 | ## Part 2 6 | 7 | ### Fortune 8 | 9 | Просят показать созданные файлы и симлинк с inode: `ls -ial /proc | grep fortune` 10 | 11 | Потом просят записать 3 раза AA, BB, CC и прочитать 4 раза, потом показать dmesg 12 | 13 | Сколько точек входа? 6 - exit, init, read, write, open, release 14 | 15 | Какой файл создали? Виртуальный, т.к. /proc/ -- виртуальная ФС 16 | 17 | Какие функции и зачем использовали? copy_from_user, copy_to_user. Почему? Процесс имеет виртуальное адресное пространство, ядро физическое. При попытке обратиться из ядра к буферу страница может быть выгружена. 18 | 19 | ### Seqfile 20 | 21 | То же самое, только точек входа 9: exit, init, read, write, open, release, start, next, show 22 | 23 | -------------------------------------------------------------------------------- /sem6/lab3/part2/md2.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include "md.h" 4 | 5 | // extern char* md1_noexport(void); 6 | 7 | MODULE_LICENSE("GPL"); 8 | MODULE_AUTHOR("Bogachenko Artem"); 9 | 10 | static int __init md_init(void) 11 | { 12 | printk("+ module md2 start!\n"); 13 | printk("+ data string exported from md1 : %s\n", md1_data); 14 | printk("+ string returned md1_proc() is : %s\n", md1_proc()); 15 | printk("+ data number exported from md1 : %d\n", md1_number); 16 | printk("+ md1_fact(5) call returns : %d\n", md1_fact(5)); 17 | // printk("+ md2 use local md1: %s\n", md1_local()); 18 | // printk("+ md2 string returned md1_noexport() is : %s\n", md1_noexport()); 19 | return 0; 20 | } 21 | static void __exit md_exit(void) 22 | { 23 | printk("+ module md2 unloaded!\n"); 24 | } 25 | 26 | module_init(md_init); 27 | module_exit(md_exit); 28 | -------------------------------------------------------------------------------- /sem5/lab4/src/1.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | int pid; 6 | int child_pids[2]; 7 | 8 | int main(void) { 9 | printf("Parent process: PID=%d, GROUP=%d\n", getpid(), getpgrp()); 10 | 11 | for (size_t i = 0; i < 2; ++i) { 12 | switch (pid = fork()) { 13 | case -1: 14 | perror("Can't fork\n"); 15 | return EXIT_FAILURE; 16 | case 0: 17 | sleep(2); 18 | printf("Child process : PID=%d, GROUP=%d, PPID=%d\n", getpid(), 19 | getpgrp(), getppid()); 20 | return EXIT_SUCCESS; 21 | default: 22 | child_pids[i] = pid; 23 | } 24 | } 25 | printf("Parent process have children with IDs: %d, %d\n", child_pids[0], 26 | child_pids[1]); 27 | printf("Parent process is dead now\n"); 28 | 29 | return EXIT_SUCCESS; 30 | } 31 | -------------------------------------------------------------------------------- /sem6/lab3/part2/md1.mod.c: -------------------------------------------------------------------------------- 1 | #include 2 | #define INCLUDE_VERMAGIC 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | BUILD_SALT; 9 | BUILD_LTO_INFO; 10 | 11 | MODULE_INFO(vermagic, VERMAGIC_STRING); 12 | MODULE_INFO(name, KBUILD_MODNAME); 13 | 14 | __visible struct module __this_module 15 | __section(".gnu.linkonce.this_module") = { 16 | .name = KBUILD_MODNAME, 17 | .init = init_module, 18 | #ifdef CONFIG_MODULE_UNLOAD 19 | .exit = cleanup_module, 20 | #endif 21 | .arch = MODULE_ARCH_INIT, 22 | }; 23 | 24 | #ifdef CONFIG_RETPOLINE 25 | MODULE_INFO(retpoline, "Y"); 26 | #endif 27 | 28 | static const struct modversion_info ____versions[] 29 | __used __section("__versions") = { 30 | { 0x52a4401f, "module_layout" }, 31 | { 0x92997ed8, "_printk" }, 32 | { 0xbdfb6dbb, "__fentry__" }, 33 | }; 34 | 35 | MODULE_INFO(depends, ""); 36 | 37 | -------------------------------------------------------------------------------- /sem6/lab5/src/1m.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #define BUF_SIZE 20 5 | #define FILENAME "alphabet.txt" 6 | 7 | void *run(void *args) { 8 | int *fd = (int *)args; 9 | FILE *fs2 = fdopen(*fd, "r"); 10 | char buff2[BUF_SIZE]; 11 | setvbuf(fs2, buff2, _IOFBF, BUF_SIZE); 12 | int flag = 1; 13 | char c; 14 | while ((flag = fscanf(fs2, "%c", &c)) == 1) { 15 | fprintf(stdout, "%c", c); 16 | } 17 | return NULL; 18 | } 19 | 20 | int main() { 21 | pthread_t td; 22 | int fd = open(FILENAME, O_RDONLY); 23 | 24 | FILE *fs1 = fdopen(fd, "r"); 25 | char buff1[BUF_SIZE]; 26 | setvbuf(fs1, buff1, _IOFBF, BUF_SIZE); 27 | pthread_create (&td, NULL, run, &fd); 28 | int flag = 1; 29 | char c; 30 | while ((flag = fscanf(fs1, "%c", &c)) == 1) { 31 | fprintf(stdout, "%c", c); 32 | } 33 | pthread_join(td, NULL); 34 | return 0; 35 | } 36 | -------------------------------------------------------------------------------- /sem5/lab1/lab_01_1/report/inc/src/sub_1.asm: -------------------------------------------------------------------------------- 1 | sub_1 proc near 2 | 3 | ;; Сохранение регистров DS, AX 4 | 020A:07B9 1E push ds 5 | 020A:07BA 50 push ax 6 | 7 | ;; Установка сегмента данных = 0040 8 | 020A:07BB B8 0040 mov ax,40h 9 | 020A:07BE 8E D8 mov ds,ax 10 | 11 | ;;Загрузка EFLAGS в AH 12 | 020A:07C0 9F lahf ; Load ah from flags 13 | 020A:07C1 F7 06 0314 2400 test word ptr ds:[314h],2400h ; (0040:0314=3200h) 14 | 020A:07C7 75 0C jnz loc_7 ; Jump if not zero 15 | 020A:07C9 F0> 81 26 0314 FDFF lock and word ptr ds:[314h],0FDFFh ; (0040:0314=3200h) 16 | 020A:07D0 loc_6: 17 | 020A:07D0 9E sahf ; Store ah into flags 18 | 020A:07D1 58 pop ax 19 | 020A:07D2 1F pop ds 20 | 020A:07D3 EB 03 jmp short loc_8 ; (07D8) 21 | 020A:07D5 loc_7: 22 | 020A:07D5 FA cli ; Disable interrupts 23 | 020A:07D6 EB F8 jmp short loc_6 ; (07D0) 24 | 020A:07D8 loc_8: 25 | 020A:07D8 C3 retn 26 | sub_1 endp 27 | -------------------------------------------------------------------------------- /sem6/lab3/part2/md3.mod.c: -------------------------------------------------------------------------------- 1 | #include 2 | #define INCLUDE_VERMAGIC 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | BUILD_SALT; 9 | BUILD_LTO_INFO; 10 | 11 | MODULE_INFO(vermagic, VERMAGIC_STRING); 12 | MODULE_INFO(name, KBUILD_MODNAME); 13 | 14 | __visible struct module __this_module 15 | __section(".gnu.linkonce.this_module") = { 16 | .name = KBUILD_MODNAME, 17 | .init = init_module, 18 | .arch = MODULE_ARCH_INIT, 19 | }; 20 | 21 | #ifdef CONFIG_RETPOLINE 22 | MODULE_INFO(retpoline, "Y"); 23 | #endif 24 | 25 | static const struct modversion_info ____versions[] 26 | __used __section("__versions") = { 27 | { 0x52a4401f, "module_layout" }, 28 | { 0xc9ad3cf, "md1_fact" }, 29 | { 0x2835192f, "md1_number" }, 30 | { 0xd46953ad, "md1_proc" }, 31 | { 0x78b97490, "md1_data" }, 32 | { 0x92997ed8, "_printk" }, 33 | { 0xbdfb6dbb, "__fentry__" }, 34 | }; 35 | 36 | MODULE_INFO(depends, "md1"); 37 | 38 | -------------------------------------------------------------------------------- /sem6/lab3/part1/md1.mod.c: -------------------------------------------------------------------------------- 1 | #include 2 | #define INCLUDE_VERMAGIC 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | BUILD_SALT; 9 | BUILD_LTO_INFO; 10 | 11 | MODULE_INFO(vermagic, VERMAGIC_STRING); 12 | MODULE_INFO(name, KBUILD_MODNAME); 13 | 14 | __visible struct module __this_module 15 | __section(".gnu.linkonce.this_module") = { 16 | .name = KBUILD_MODNAME, 17 | .init = init_module, 18 | #ifdef CONFIG_MODULE_UNLOAD 19 | .exit = cleanup_module, 20 | #endif 21 | .arch = MODULE_ARCH_INIT, 22 | }; 23 | 24 | #ifdef CONFIG_RETPOLINE 25 | MODULE_INFO(retpoline, "Y"); 26 | #endif 27 | 28 | static const struct modversion_info ____versions[] 29 | __used __section("__versions") = { 30 | { 0x52a4401f, "module_layout" }, 31 | { 0x98345676, "current_task" }, 32 | { 0x92997ed8, "_printk" }, 33 | { 0x19a09649, "init_task" }, 34 | { 0xbdfb6dbb, "__fentry__" }, 35 | }; 36 | 37 | MODULE_INFO(depends, ""); 38 | 39 | -------------------------------------------------------------------------------- /sem6/lab3/part2/md2.mod.c: -------------------------------------------------------------------------------- 1 | #include 2 | #define INCLUDE_VERMAGIC 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | BUILD_SALT; 9 | BUILD_LTO_INFO; 10 | 11 | MODULE_INFO(vermagic, VERMAGIC_STRING); 12 | MODULE_INFO(name, KBUILD_MODNAME); 13 | 14 | __visible struct module __this_module 15 | __section(".gnu.linkonce.this_module") = { 16 | .name = KBUILD_MODNAME, 17 | .init = init_module, 18 | #ifdef CONFIG_MODULE_UNLOAD 19 | .exit = cleanup_module, 20 | #endif 21 | .arch = MODULE_ARCH_INIT, 22 | }; 23 | 24 | #ifdef CONFIG_RETPOLINE 25 | MODULE_INFO(retpoline, "Y"); 26 | #endif 27 | 28 | static const struct modversion_info ____versions[] 29 | __used __section("__versions") = { 30 | { 0x52a4401f, "module_layout" }, 31 | { 0xc9ad3cf, "md1_fact" }, 32 | { 0x2835192f, "md1_number" }, 33 | { 0xd46953ad, "md1_proc" }, 34 | { 0x78b97490, "md1_data" }, 35 | { 0x92997ed8, "_printk" }, 36 | { 0xbdfb6dbb, "__fentry__" }, 37 | }; 38 | 39 | MODULE_INFO(depends, "md1"); 40 | 41 | -------------------------------------------------------------------------------- /sem6/lab3/part2/md1.c: -------------------------------------------------------------------------------- 1 | #include "md.h" 2 | #include 3 | #include 4 | #include 5 | 6 | MODULE_LICENSE("GPL"); 7 | MODULE_AUTHOR("Bogachenko Artem"); 8 | 9 | char* md1_data = "Привет мир!"; 10 | int md1_number = 17; 11 | 12 | extern char* md1_proc(void) 13 | { 14 | return md1_data; 15 | } 16 | extern int md1_fact(int n) { 17 | int i = 1, res = 1; 18 | while (i++ < n) 19 | res *= i; 20 | return res; 21 | } 22 | static char* md1_local(void) 23 | { 24 | return md1_data; 25 | } 26 | extern char* md1_noexport(void) 27 | { 28 | return md1_data; 29 | } 30 | 31 | EXPORT_SYMBOL(md1_number); 32 | EXPORT_SYMBOL(md1_fact); 33 | EXPORT_SYMBOL(md1_data); 34 | EXPORT_SYMBOL(md1_proc); 35 | // EXPORT_SYMBOL(md1_local); 36 | EXPORT_SYMBOL(md1_noexport); 37 | 38 | 39 | static int __init md_init(void) 40 | { 41 | printk("+ module md1 start!\n"); 42 | return 0; 43 | } 44 | 45 | static void __exit md_exit(void) 46 | { 47 | printk("+ module md1 unloaded!\n"); 48 | } 49 | 50 | module_init(md_init); 51 | module_exit(md_exit); 52 | -------------------------------------------------------------------------------- /sem5/lab1/lab_01_2/report/report.toc: -------------------------------------------------------------------------------- 1 | \babel@toc {russian}{} 2 | \contentsline {chapter}{\numberline {1}Функции обработчика прерываний от системного таймера}{2}{}% 3 | \contentsline {section}{\numberline {1.1}ОС семейства Unix/Linux}{2}{}% 4 | \contentsline {section}{\numberline {1.2}Windows-системы}{3}{}% 5 | \contentsline {chapter}{\numberline {2}Пересчёт динамических приоритетов}{5}{}% 6 | \contentsline {section}{\numberline {2.1}ОС семейства Unix/Linux}{5}{}% 7 | \contentsline {subsection}{\numberline {2.1.1}Приоритеты процессов}{5}{}% 8 | \contentsline {section}{\numberline {2.2}Windows-системы}{8}{}% 9 | \contentsline {subsection}{\numberline {2.2.1}Приоритеты потоков}{8}{}% 10 | \contentsline {subsection}{\numberline {2.2.2}Повышение приоритета по завершении операции ввода-вывода}{11}{}% 11 | \contentsline {subsection}{\numberline {2.2.3}Повышение приоритета по окончании ожидания на событии или семафоре}{12}{}% 12 | \contentsline {subsection}{\numberline {2.2.4}Повышение приоритета по окончании ожидания потоками активного процесса}{12}{}% 13 | \contentsline {subsection}{\numberline {2.2.5}Повышение приоритета при пробуждении GUI-потоков}{13}{}% 14 | \contentsline {subsection}{\numberline {2.2.6}Повышение приоритета при нехватке процессорного времени}{13}{}% 15 | -------------------------------------------------------------------------------- /sem6/lab8/inet/client.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #define SOCKET_PORT 8888 11 | #define BUF_SIZE 256 12 | 13 | int main(void) { 14 | int sfd = socket(AF_INET, SOCK_STREAM, 0); 15 | if (sfd == -1) { 16 | perror("socket call error"); 17 | return errno; 18 | } 19 | 20 | struct sockaddr_in addr; 21 | addr.sin_family = AF_INET; 22 | addr.sin_addr.s_addr = INADDR_ANY; 23 | addr.sin_port = htons(SOCKET_PORT); 24 | memset(addr.sin_zero, 0, sizeof(addr.sin_zero)); 25 | 26 | if (connect(sfd, (struct sockaddr*)&addr, sizeof(addr)) == -1) { 27 | perror("connect call error"); 28 | return errno; 29 | } 30 | 31 | char msg[BUF_SIZE]; 32 | for(;;) { 33 | snprintf(msg, BUF_SIZE, "Hello from process #%d", getpid()); 34 | /*if (sendto(sfd, msg, strlen(msg), 0, (struct sockaddr*)&addr, sizeof(addr)) == -1) {*/ 35 | if (send(sfd, msg, strlen(msg), 0) == -1) { 36 | perror("sendto call error"); 37 | return errno; 38 | } 39 | printf("Send message: %s\n", msg); 40 | sleep(3); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /sem6/lab3/part2/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Соберем модули ядра 3 | make 4 | echo ">>>>> Loading md1.ko..." 5 | echo 6 | sleep 0.8 7 | 8 | # Загрузим модули ядра 9 | insmod md1.ko 10 | echo ">>>>> Loading md2.ko..." 11 | echo 12 | sleep 0.8 13 | insmod md2.ko 14 | echo ">>>>> Modules 1 and 2 was loaded. Let's look at them: " 15 | 16 | # Выведем список загружен модулей ядра, чье название содержит строку «md» 17 | lsmod | grep md 18 | echo 19 | sleep 1 20 | 21 | # Посмотрим последние 15 сообщений, выведенных модулями ядра 22 | echo ">>>>> This is the last 15 lines in the system log: " 23 | dmesg | tail -15 24 | echo 25 | read -n 1 -s -r -p "Press any key to continue..." 26 | echo 27 | 28 | # Выгрузим 2ой модуль ядра 29 | echo ">>>>> Remove md2..." 30 | rmmod md2 31 | echo 32 | sleep 0.8 33 | 34 | # Загрузим 3ий модуль ядра, возвращающий ошибку 35 | echo ">>>>> Loading md3.ko..." 36 | echo 37 | insmod md3.ko 38 | sleep 0.8 39 | 40 | # Посмотрим последние 15 сообщений, выведенных модулями ядра 41 | echo ">>>>> This is the last 15 lines in the system log: " 42 | dmesg | tail -15 43 | echo 44 | read -n 1 -s -r -p "Press any key to continue..." 45 | echo 46 | 47 | # Выгрузим 3ий и 1ый модули ядра 48 | echo ">>>>> Remove md3..." 49 | rmmod md3 50 | echo 51 | sleep 0.8 52 | echo ">>>>> Remove md1..." 53 | rmmod md1 54 | echo 55 | sleep 0.8 56 | 57 | # Посмотрим последние 5 сообщений, выведенных модулями ядра 58 | dmesg | tail -5 59 | -------------------------------------------------------------------------------- /sem5/lab1/lab_01_2/report/preamble.inc.tex: -------------------------------------------------------------------------------- 1 | \usepackage{cmap} % Улучшенный поиск русских слов в полученном pdf-файле 2 | \usepackage[T2A]{fontenc} % Поддержка русских букв 3 | \usepackage[utf8]{inputenc} % Кодировка utf8 4 | \usepackage[english,russian]{babel} % Языки: русский, английский 5 | \usepackage{enumitem} 6 | \usepackage{caption} 7 | 8 | \captionsetup{labelsep=endash} 9 | \captionsetup[figure]{name=Рисунок} 10 | 11 | \usepackage{amsmath} 12 | \usepackage{listings} 13 | 14 | \usepackage{geometry} 15 | \geometry{left=30mm} 16 | \geometry{right=15mm} 17 | \geometry{top=20mm} 18 | \geometry{bottom=20mm} 19 | 20 | \usepackage{titlesec} 21 | \titleformat{\section} 22 | {\normalsize\bfseries} 23 | {\thesection} 24 | {1em}{} 25 | \titlespacing*{\chapter}{0pt}{-30pt}{8pt} 26 | \titlespacing*{\section}{\parindent}{*4}{*4} 27 | \titlespacing*{\subsection}{\parindent}{*4}{*4} 28 | 29 | \usepackage{setspace} 30 | \onehalfspacing % Полуторный интервал 31 | 32 | \frenchspacing 33 | \usepackage{indentfirst} % Красная строка 34 | 35 | \usepackage{titlesec} 36 | \titleformat{\chapter}{\LARGE\bfseries}{\thechapter}{20pt}{\LARGE\bfseries} 37 | \titleformat{\section}{\Large\bfseries}{\thesection}{20pt}{\Large\bfseries} 38 | 39 | \usepackage{graphicx} 40 | \newcommand{\img}[3] { 41 | \begin{figure}[h] 42 | \center{\includegraphics[height=#1]{inc/img/#2}} 43 | \caption{#3} 44 | \label{img:#2} 45 | \end{figure} 46 | } 47 | 48 | \newcommand{\code}[1]{\texttt{#1}} 49 | 50 | -------------------------------------------------------------------------------- /sem5/lab4/src/2.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | int pid; 8 | int child_pids[2]; 9 | 10 | int main(void) { 11 | printf("Parent process: PID=%d, GROUP=%d\n", getpid(), getpgrp()); 12 | 13 | for (size_t i = 0; i < 2; ++i) { 14 | switch (pid = fork()) { 15 | case -1: 16 | perror("Can't fork\n"); 17 | return EXIT_FAILURE; 18 | case 0: 19 | sleep(2); 20 | printf("Child process : PID=%d, GROUP=%d, PPID=%d\n", getpid(), 21 | getpgrp(), getppid()); 22 | return EXIT_FAILURE; 23 | default: 24 | child_pids[i] = pid; 25 | } 26 | } 27 | 28 | for (size_t i = 0; i < 2; ++i) { 29 | int status; 30 | pid_t childpid = wait(&status); 31 | printf("Child process finished: PID = %d, status = %d\n", childpid, status); 32 | 33 | int stat_val; 34 | if (WIFEXITED(stat_val)) { 35 | printf("Child process exited with code %d\n", 36 | WEXITSTATUS(stat_val)); 37 | } else { 38 | printf("Child process terminated abnormally\n"); 39 | } 40 | } 41 | 42 | printf("Parent process have children with IDs: %d, %d\n", child_pids[0], 43 | child_pids[1]); 44 | printf("Parent process is dead now\n"); 45 | 46 | return EXIT_SUCCESS; 47 | } -------------------------------------------------------------------------------- /sem5/lab1/lab_01_1/report/title.tex: -------------------------------------------------------------------------------- 1 | \begin{titlepage} 2 | \thispagestyle{empty} 3 | 4 | \noindent \begin{minipage}{0.15\textwidth} 5 | \includegraphics[width=\linewidth]{inc/img/b_logo} 6 | \end{minipage} 7 | \noindent\begin{minipage}{0.9\textwidth}\centering 8 | \textbf{Министерство науки и высшего образования Российской Федерации}\\ 9 | \textbf{Федеральное государственное бюджетное образовательное учреждение высшего образования}\\ 10 | \textbf{«Московский государственный технический университет имени Н.Э.~Баумана}\\ 11 | \textbf{(национальный исследовательский университет)»}\\ 12 | \textbf{(МГТУ им. Н.Э.~Баумана)} 13 | \end{minipage} 14 | 15 | \noindent\rule{18cm}{3pt} 16 | \newline\newline 17 | \noindent ФАКУЛЬТЕТ $\underline{\text{«Информатика и системы управления»}}$ \newline\newline 18 | \noindent КАФЕДРА $\underline{\text{«Программное обеспечение ЭВМ и информационные технологии»}}$\newline\newline\newline\newline\newline\newline\newline 19 | 20 | 21 | \begin{center} 22 | 23 | \Large\textbf{Лабораторная работа № 1}\newline 24 | \end{center} 25 | 26 | \noindent\textbf{Тема} $\underline{\text{Дизассемблирование прерывания INT 8h}}$\newline\newline\newline 27 | \noindent\textbf{Студент} $\underline{\text{Богаченко Артем~~~~~~~~~~~~~~}}$\newline\newline 28 | \noindent\textbf{Группа} $\underline{\text{ИУ7-56Б~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 29 | \noindent\textbf{Оценка (баллы)} $\underline{\text{~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 30 | \noindent\textbf{Преподаватель} $\underline{\text{Рязанова Н. Ю.}}$\newline 31 | 32 | \begin{center} 33 | \vfill 34 | Москва~---~\the\year 35 | ~г. 36 | \end{center} 37 | \end{titlepage} 38 | -------------------------------------------------------------------------------- /sem5/lab5/report/lab.tex: -------------------------------------------------------------------------------- 1 | \chapter*{Задача <<Производство-потребление>>} 2 | 3 | 4 | \section*{Листинги кода} 5 | 6 | 7 | \begin{lstinputlisting}[caption={Очередь на основе циклического массива (буфера). Код.},style={CStyle}]{../pc/src/buffer.c} 8 | \end{lstinputlisting} 9 | 10 | \begin{lstinputlisting}[caption={Очередь на основе циклического массива (буфера). Заголовочник.},style={CStyle}]{../pc/include/buffer.h} 11 | \end{lstinputlisting} 12 | 13 | \begin{lstinputlisting}[caption={Реализация задачи. Код.},style={CStyle}]{../pc/src/runners.c} 14 | \end{lstinputlisting} 15 | 16 | \begin{lstinputlisting}[caption={Реализация задачи. Заголовочник.},style={CStyle}]{../pc/include/runners.h} 17 | \end{lstinputlisting} 18 | 19 | \begin{lstinputlisting}[caption={Точка входа в программу},style={CStyle}]{../pc/src/main.c} 20 | \end{lstinputlisting} 21 | 22 | \clearpage 23 | \section*{Работа программы} 24 | 25 | \img{165mm}{pc}{<<Производство-Потребление>>. Максимальная задержка потребителя -- 5с, производителя -- 2с.} 26 | 27 | \chapter*{Задача <<Читатели-Писатели>>} 28 | 29 | \section*{Листинги кода} 30 | 31 | \begin{lstinputlisting}[caption={Реализация задачи. Код.},style={CStyle}]{../rw/src/io.c} 32 | \end{lstinputlisting} 33 | 34 | \begin{lstinputlisting}[caption={Реализация задачи. Заголовочник.},style={CStyle}]{../rw/include/io.h} 35 | \end{lstinputlisting} 36 | 37 | \begin{lstinputlisting}[caption={Точка входа в программу},style={CStyle}]{../rw/src/main.c} 38 | \end{lstinputlisting} 39 | 40 | \clearpage 41 | \section*{Работа программы} 42 | 43 | \img{165mm}{rw}{<<Читатели-Писатели>>. Максимальная задержка -- 3с.} 44 | -------------------------------------------------------------------------------- /sem6/lab9/tasklet/tasklet.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | MODULE_LICENSE("GPL"); 7 | MODULE_AUTHOR("Bogachenko Artem"); 8 | 9 | #define KEYB_IRQ 1 10 | 11 | char my_tasklet_data[] = "KEYBOARD IRQ"; 12 | struct tasklet_struct my_tasklet; 13 | 14 | void my_tasklet_func(unsigned long data) { 15 | printk(KERN_DEBUG "+ Tasklet: state - %d, count - %d, data - %ld\n", 16 | my_tasklet.state, my_tasklet.count, my_tasklet.data); 17 | } 18 | 19 | irqreturn_t irq_handler(int irq, void *dev) { 20 | if (irq == KEYB_IRQ) { 21 | tasklet_schedule(&my_tasklet); 22 | printk(KERN_DEBUG "+ Interrupt - KEYBOARD!\n"); 23 | 24 | return IRQ_HANDLED; 25 | } else 26 | return IRQ_NONE; 27 | } 28 | 29 | static int __init my_module_init(void) { 30 | printk(KERN_DEBUG "+ loaded!\n"); 31 | 32 | int ret = request_irq(KEYB_IRQ, (irq_handler_t)irq_handler, IRQF_SHARED, 33 | "keyboard", (void *)(irq_handler)); 34 | 35 | if (ret != 0) { 36 | printk(KERN_ERR "+ KEYBOARD IRQ handler wasn't registered"); 37 | return ret; 38 | } 39 | 40 | printk(KERN_DEBUG "+ KEYBOARD IRQ handler was registered successfully"); 41 | 42 | tasklet_init(&my_tasklet, my_tasklet_func, (void *)(irq_handler)); 43 | return ret; 44 | } 45 | 46 | static void __exit my_module_exit(void) { 47 | free_irq(KEYB_IRQ, (void *)(irq_handler)); 48 | 49 | tasklet_disable(&my_tasklet); 50 | tasklet_kill(&my_tasklet); 51 | printk(KERN_DEBUG "+ unloaded!\n"); 52 | } 53 | 54 | module_init(my_module_init); 55 | module_exit(my_module_exit); 56 | -------------------------------------------------------------------------------- /sem5/lab4/src/3.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | int pid; 8 | int child_pids[2]; 9 | const char volatile *const cmd[2] = {"ls", "whoami"}; 10 | 11 | int main() { 12 | printf("Parent process: PID=%d, GROUP=%d\n", getpid(), getpgrp()); 13 | 14 | for (size_t i = 0; i < 2; ++i) { 15 | switch (pid = fork()) { 16 | case -1: 17 | perror("Can't fork\n"); 18 | return EXIT_FAILURE; 19 | case 0: 20 | printf("Child process : PID=%d, GROUP=%d, PPID=%d\n\n", 21 | getpid(), getpgrp(), getppid()); 22 | 23 | switch (execlp(cmd[i], cmd[i], 0)) { 24 | case -1: 25 | perror("Can't exec\n"); 26 | return EXIT_FAILURE; 27 | case 0: 28 | return EXIT_SUCCESS; 29 | } 30 | default: 31 | child_pids[i] = pid; 32 | } 33 | } 34 | 35 | for (size_t i = 0; i < 2; ++i) { 36 | int status; 37 | pid_t childpid = wait(&status); 38 | printf("\nChild process finished: PID = %d, status = %d\n", childpid, status); 39 | int stat_val; 40 | if (WIFEXITED(stat_val)) { 41 | printf("Child process exited with code %d\n", 42 | WEXITSTATUS(stat_val)); 43 | } else { 44 | printf("Child process terminated abnormally\n"); 45 | } 46 | } 47 | 48 | printf("Parent process have children with IDs: %d, %d\n", child_pids[0], 49 | child_pids[1]); 50 | printf("Parent process is dead now\n"); 51 | 52 | return EXIT_SUCCESS; 53 | } -------------------------------------------------------------------------------- /sem6/lab8/unix/client.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | #include "socket.h" 10 | 11 | void CreateMessage(char buf[MAX_MSG_LEN], int argc, char *argv[]) { 12 | long int curr_time = time(NULL); 13 | 14 | sprintf(buf, "\n\n" YELLOW "PID: %d" GREEN "\ntime: %smsg: " BLUE, getpid(), 15 | ctime(&curr_time)); 16 | 17 | if (argc < 2) 18 | strcat(buf, "Hello world!"); 19 | else 20 | strcat(buf, argv[1]); 21 | } 22 | 23 | int main(int argc, char *argv[]) { 24 | struct sockaddr srvr_name; 25 | int sock; 26 | 27 | char buf[MAX_MSG_LEN]; 28 | CreateMessage(buf, argc, argv); 29 | // printf("%s", buf); 30 | 31 | sock = socket(AF_UNIX, SOCK_DGRAM, SOCK_STREAM); 32 | if (sock < 0) { 33 | perror("socket failed"); 34 | return ERROR_CREATE_SOCKET; 35 | } 36 | 37 | srvr_name.sa_family = AF_UNIX; 38 | strcpy(srvr_name.sa_data, SOCK_NAME); 39 | 40 | // 0 - доп флаги. 41 | if (sendto(sock, buf, strlen(buf) + 1, 0, &srvr_name, 42 | LEN_STRUCT_SOCKADDR(srvr_name)) < 0) { 43 | perror("sendto failed"); 44 | return ERROR_SENDTO_SOCKET; 45 | } 46 | 47 | int bytes; 48 | int namelen; 49 | while (TRUE) { 50 | bytes = recvfrom(sock, buf, sizeof(buf), 0, &srvr_name, &namelen); 51 | 52 | if (bytes < 0) { 53 | perror("recvfrom failed"); 54 | return ERROR_RECVFROM_SOCKET; 55 | } 56 | 57 | printf("\n\nReceived message: %s" WHITE "\nLen = %ld\n______", buf, 58 | strlen(buf)); 59 | 60 | } 61 | 62 | close(sock); 63 | printf("Send!"); 64 | return OK; 65 | } 66 | -------------------------------------------------------------------------------- /sem6/lab5/src/struct_io_file.c: -------------------------------------------------------------------------------- 1 | struct _IO_FILE 2 | { 3 | int _flags; /* High-order word is _IO_MAGIC; rest is flags. */ 4 | 5 | /* The following pointers correspond to the C++ streambuf protocol. */ 6 | char *_IO_read_ptr; /* Current read pointer */ 7 | char *_IO_read_end; /* End of get area. */ 8 | char *_IO_read_base; /* Start of putback+get area. */ 9 | char *_IO_write_base; /* Start of put area. */ 10 | char *_IO_write_ptr; /* Current put pointer. */ 11 | char *_IO_write_end; /* End of put area. */ 12 | char *_IO_buf_base; /* Start of reserve area. */ 13 | char *_IO_buf_end; /* End of reserve area. */ 14 | 15 | /* The following fields are used to support backing up and undo. */ 16 | char *_IO_save_base; /* Pointer to start of non-current get area. */ 17 | char *_IO_backup_base; /* Pointer to first valid character of backup area */ 18 | char *_IO_save_end; /* Pointer to end of non-current get area. */ 19 | 20 | struct _IO_marker *_markers; 21 | 22 | struct _IO_FILE *_chain; 23 | 24 | int _fileno; 25 | int _flags2; 26 | __off_t _old_offset; /* This used to be _offset but it's too small. */ 27 | 28 | /* 1+column number of pbase(); 0 is unknown. */ 29 | unsigned short _cur_column; 30 | signed char _vtable_offset; 31 | char _shortbuf[1]; 32 | 33 | _IO_lock_t *_lock; 34 | #ifdef _IO_USE_OLD_IO_FILE 35 | }; 36 | 37 | struct _IO_FILE_complete 38 | { 39 | struct _IO_FILE _file; 40 | #endif 41 | __off64_t _offset; 42 | /* Wide character stream stuff. */ 43 | struct _IO_codecvt *_codecvt; 44 | struct _IO_wide_data *_wide_data; 45 | struct _IO_FILE *_freeres_list; 46 | void *_freeres_buf; 47 | size_t __pad5; 48 | int _mode; 49 | /* Make sure we don't get into trouble again. */ 50 | char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)]; 51 | }; -------------------------------------------------------------------------------- /sem5/lab4/src/4.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | int pid; 9 | int child_pids[2]; 10 | const char volatile *msg[] = {"message1", "message2"}; 11 | 12 | int main() { 13 | int fd[2]; 14 | char buffer[50] = {0}; 15 | 16 | printf("Parent process: PID=%d, GROUP=%d\n", getpid(), getpgrp()); 17 | if (pipe(fd) == -1) { 18 | perror("Can't pipe\n"); 19 | return EXIT_FAILURE; 20 | } 21 | 22 | for (size_t i = 0; i < 2; ++i) { 23 | switch (pid = fork()) { 24 | case -1: 25 | perror("Can't fork\n"); 26 | exit(EXIT_FAILURE); 27 | case 0: 28 | close(fd[0]); 29 | write(fd[1], msg[i], strlen(msg[i])); 30 | printf("Message has been sent to parent\n"); 31 | exit(EXIT_SUCCESS); 32 | default: 33 | child_pids[i] = pid; 34 | } 35 | } 36 | 37 | for (size_t i = 0; i < 2; ++i) { 38 | int status; 39 | pid_t childpid = wait(&status); 40 | printf("Child process finished: PID = %d, status = %d\n", childpid, status); 41 | 42 | int stat_val; 43 | if (WIFEXITED(stat_val)) { 44 | printf("Child process exited with code %d\n", 45 | WEXITSTATUS(stat_val)); 46 | } else { 47 | printf("Child process terminated abnormally\n"); 48 | } 49 | } 50 | 51 | close(fd[1]); 52 | read(fd[0], buffer, sizeof(buffer)); 53 | printf("Received message: %s\n", buffer); 54 | 55 | printf("Parent process have children with IDs: %d, %d\n", child_pids[0], 56 | child_pids[1]); 57 | printf("Parent process is dead now\n"); 58 | 59 | return EXIT_SUCCESS; 60 | } -------------------------------------------------------------------------------- /sem5/lab3/report/00-title.tex: -------------------------------------------------------------------------------- 1 | \begin{titlepage} 2 | \newgeometry{pdftex, left=2cm, right=2cm, top=2.5cm, bottom=2.5cm} 3 | \fontsize{12pt}{12pt}\selectfont 4 | \noindent \begin{minipage}{0.15\textwidth} 5 | \includegraphics[width=\linewidth]{inc/img/b_logo.jpg} 6 | \end{minipage} 7 | \noindent\begin{minipage}{0.9\textwidth}\centering 8 | \textbf{Министерство науки и высшего образования Российской Федерации}\\ 9 | \textbf{Федеральное государственное бюджетное образовательное учреждение высшего образования}\\ 10 | \textbf{«Московский государственный технический университет имени Н.Э.~Баумана}\\ 11 | \textbf{(национальный исследовательский университет)»}\\ 12 | \textbf{(МГТУ им. Н.Э.~Баумана)} 13 | \end{minipage} 14 | 15 | \noindent\rule{18cm}{3pt} 16 | \newline\newline 17 | \noindent ФАКУЛЬТЕТ $\underline{\text{«Информатика и системы управления»}}$ \newline\newline 18 | \noindent КАФЕДРА $\underline{\text{«Программное обеспечение ЭВМ и информационные технологии»}}$\newline\newline\newline\newline\newline\newline\newline 19 | 20 | 21 | \begin{center} 22 | \Large\textbf{Отчет по лабораторной работе №3 по курсу <<Операционные системы>>} 23 | \end{center} 24 | 25 | \noindent\textbf{Тема} $\underline{\text{Основы Linux}}$\newline\newline\newline 26 | \noindent\textbf{Студент} $\underline{\text{Богаченко А.~Е.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 27 | \noindent\textbf{Группа} $\underline{\text{ИУ7-56Б~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 28 | \noindent\textbf{Оценка (баллы)} $\underline{\text{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 29 | \noindent\textbf{Преподаватели} $\underline{\text{Рязанова Н.Ю.~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline 30 | 31 | \begin{center} 32 | \vfill 33 | Москва~---~\the\year 34 | ~г. 35 | \end{center} 36 | \restoregeometry 37 | \end{titlepage} 38 | -------------------------------------------------------------------------------- /sem6/lab6/report/tex/title.tex: -------------------------------------------------------------------------------- 1 | \begin{titlepage} 2 | \newgeometry{pdftex, left=2cm, right=2cm, top=2.5cm, bottom=2.5cm} 3 | \fontsize{12pt}{12pt}\selectfont 4 | \noindent \begin{minipage}{0.15\textwidth} 5 | \includegraphics[width=\linewidth]{inc/b_logo.jpg} 6 | \end{minipage} 7 | \noindent\begin{minipage}{0.9\textwidth}\centering 8 | \textbf{Министерство науки и высшего образования Российской Федерации}\\ 9 | \textbf{Федеральное государственное бюджетное образовательное учреждение высшего образования}\\ 10 | \textbf{«Московский государственный технический университет имени Н.Э.~Баумана}\\ 11 | \textbf{(национальный исследовательский университет)»}\\ 12 | \textbf{(МГТУ им. Н.Э.~Баумана)} 13 | \end{minipage} 14 | 15 | \noindent\rule{18cm}{3pt} 16 | \newline\newline 17 | \noindent ФАКУЛЬТЕТ $\underline{\text{«Информатика и системы управления»}}$ \newline\newline 18 | \noindent КАФЕДРА $\underline{\text{«Программное обеспечение ЭВМ и информационные технологии»}}$\newline\newline\newline\newline\newline\newline\newline 19 | 20 | 21 | \begin{center} 22 | \Large\textbf{Отчет по лабораторной работе №6 по курсу <<Операционные системы>>} 23 | \end{center} 24 | 25 | \noindent\textbf{Тема} $\underline{\text{Системный вызов \texttt{open}}}$\newline\newline\newline 26 | \noindent\textbf{Студент} $\underline{\text{Богаченко А.Е.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 27 | \noindent\textbf{Группа} $\underline{\text{ИУ7-65Б~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 28 | \noindent\textbf{Оценка (баллы)} $\underline{\text{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 29 | \noindent\textbf{Преподаватели} $\underline{\text{Рязанова~Н.~Ю.~~}}$\newline 30 | 31 | \begin{center} 32 | \vfill 33 | Москва~---~\the\year 34 | ~г. 35 | \end{center} 36 | \restoregeometry 37 | \end{titlepage} 38 | -------------------------------------------------------------------------------- /sem5/lab5/report/00-title.tex: -------------------------------------------------------------------------------- 1 | \begin{titlepage} 2 | \newgeometry{pdftex, left=2cm, right=2cm, top=2.5cm, bottom=2.5cm} 3 | \fontsize{12pt}{12pt}\selectfont 4 | \noindent \begin{minipage}{0.15\textwidth} 5 | \includegraphics[width=\linewidth]{inc/img/b_logo.jpg} 6 | \end{minipage} 7 | \noindent\begin{minipage}{0.9\textwidth}\centering 8 | \textbf{Министерство науки и высшего образования Российской Федерации}\\ 9 | \textbf{Федеральное государственное бюджетное образовательное учреждение высшего образования}\\ 10 | \textbf{«Московский государственный технический университет имени Н.Э.~Баумана}\\ 11 | \textbf{(национальный исследовательский университет)»}\\ 12 | \textbf{(МГТУ им. Н.Э.~Баумана)} 13 | \end{minipage} 14 | 15 | \noindent\rule{18cm}{3pt} 16 | \newline\newline 17 | \noindent ФАКУЛЬТЕТ $\underline{\text{«Информатика и системы управления»}}$ \newline\newline 18 | \noindent КАФЕДРА $\underline{\text{«Программное обеспечение ЭВМ и информационные технологии»}}$\newline\newline\newline\newline\newline\newline\newline 19 | 20 | 21 | \begin{center} 22 | \Large\textbf{Отчет по лабораторной работе №5 по курсу <<Операционные системы>>} 23 | \end{center} 24 | 25 | \noindent\textbf{Тема} $\underline{\text{Взаимодействие параллельных процессов}}$\newline\newline\newline 26 | \noindent\textbf{Студент} $\underline{\text{Богаченко А.Е.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 27 | \noindent\textbf{Группа} $\underline{\text{ИУ7-56Б~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 28 | \noindent\textbf{Оценка (баллы)} $\underline{\text{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 29 | \noindent\textbf{Преподаватели} $\underline{\text{Рязанова~Н.~Ю.~~}}$\newline 30 | 31 | \begin{center} 32 | \vfill 33 | Москва~---~\the\year 34 | ~г. 35 | \end{center} 36 | \restoregeometry 37 | \end{titlepage} 38 | -------------------------------------------------------------------------------- /sem5/lab4/report/00-title.tex: -------------------------------------------------------------------------------- 1 | \begin{titlepage} 2 | \newgeometry{pdftex, left=2cm, right=2cm, top=2.5cm, bottom=2.5cm} 3 | \fontsize{12pt}{12pt}\selectfont 4 | \noindent \begin{minipage}{0.15\textwidth} 5 | \includegraphics[width=\linewidth]{inc/img/b_logo.jpg} 6 | \end{minipage} 7 | \noindent\begin{minipage}{0.9\textwidth}\centering 8 | \textbf{Министерство науки и высшего образования Российской Федерации}\\ 9 | \textbf{Федеральное государственное бюджетное образовательное учреждение высшего образования}\\ 10 | \textbf{«Московский государственный технический университет имени Н.Э.~Баумана}\\ 11 | \textbf{(национальный исследовательский университет)»}\\ 12 | \textbf{(МГТУ им. Н.Э.~Баумана)} 13 | \end{minipage} 14 | 15 | \noindent\rule{18cm}{3pt} 16 | \newline\newline 17 | \noindent ФАКУЛЬТЕТ $\underline{\text{«Информатика и системы управления»}}$ \newline\newline 18 | \noindent КАФЕДРА $\underline{\text{«Программное обеспечение ЭВМ и информационные технологии»}}$\newline\newline\newline\newline\newline\newline\newline 19 | 20 | 21 | \begin{center} 22 | \Large\textbf{Отчет по лабораторной работе №4 по курсу <<Операционные системы>>} 23 | \end{center} 24 | 25 | \noindent\textbf{Тема} $\underline{\text{Процессы. Системные вызовы fork() и exec()}}$\newline\newline\newline 26 | \noindent\textbf{Студент} $\underline{\text{Богаченко А.Е.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 27 | \noindent\textbf{Группа} $\underline{\text{ИУ7-56Б~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 28 | \noindent\textbf{Оценка (баллы)} $\underline{\text{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 29 | \noindent\textbf{Преподаватели} $\underline{\text{Рязанова~Н.~Ю.~~}}$\newline 30 | 31 | \begin{center} 32 | \vfill 33 | Москва~---~\the\year 34 | ~г. 35 | \end{center} 36 | \restoregeometry 37 | \end{titlepage} 38 | -------------------------------------------------------------------------------- /sem6/lab5/report/tex/title.tex: -------------------------------------------------------------------------------- 1 | \begin{titlepage} 2 | \newgeometry{pdftex, left=2cm, right=2cm, top=2.5cm, bottom=2.5cm} 3 | \fontsize{12pt}{12pt}\selectfont 4 | \noindent \begin{minipage}{0.15\textwidth} 5 | \includegraphics[width=\linewidth]{inc/b_logo.jpg} 6 | \end{minipage} 7 | \noindent\begin{minipage}{0.9\textwidth}\centering 8 | \textbf{Министерство науки и высшего образования Российской Федерации}\\ 9 | \textbf{Федеральное государственное бюджетное образовательное учреждение высшего образования}\\ 10 | \textbf{«Московский государственный технический университет имени Н.Э.~Баумана}\\ 11 | \textbf{(национальный исследовательский университет)»}\\ 12 | \textbf{(МГТУ им. Н.Э.~Баумана)} 13 | \end{minipage} 14 | 15 | \noindent\rule{18cm}{3pt} 16 | \newline\newline 17 | \noindent ФАКУЛЬТЕТ $\underline{\text{«Информатика и системы управления»}}$ \newline\newline 18 | \noindent КАФЕДРА $\underline{\text{«Программное обеспечение ЭВМ и информационные технологии»}}$\newline\newline\newline\newline\newline\newline\newline 19 | 20 | 21 | \begin{center} 22 | \Large\textbf{Отчет по лабораторной работе №5 по курсу <<Операционные системы>>} 23 | \end{center} 24 | 25 | \noindent\textbf{Тема} $\underline{\text{Буферизованный и небуферизированный ввод-вывод}}$\newline\newline\newline 26 | \noindent\textbf{Студент} $\underline{\text{Богаченко А.Е.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 27 | \noindent\textbf{Группа} $\underline{\text{ИУ7-65Б~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 28 | \noindent\textbf{Оценка (баллы)} $\underline{\text{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 29 | \noindent\textbf{Преподаватели} $\underline{\text{Рязанова~Н.~Ю.~~}}$\newline 30 | 31 | \begin{center} 32 | \vfill 33 | Москва~---~\the\year 34 | ~г. 35 | \end{center} 36 | \restoregeometry 37 | \end{titlepage} 38 | -------------------------------------------------------------------------------- /sem6/lab8/unix/server.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | #include "socket.h" 10 | 11 | void Cleanup(int sock) { 12 | close(sock); 13 | unlink(SOCK_NAME); 14 | } 15 | 16 | int main(int argc, char *argv[]) { 17 | struct sockaddr srvr_name; 18 | struct sockaddr rcvr_name; 19 | int namelen; 20 | 21 | char buf[MAX_MSG_LEN]; 22 | 23 | int sock; 24 | int bytes; 25 | 26 | long int curr_time = time(NULL); 27 | 28 | // AF_UNIX - сокеты в файловом пространстве имен. 29 | // SOCK_DGRAM - датаграмный сокет. Хранит границы сообщений. 30 | sock = socket(AF_UNIX, SOCK_DGRAM, SOCK_STREAM); 31 | if (sock < 0) { 32 | perror("socket failed"); 33 | return ERROR_CREATE_SOCKET; 34 | } 35 | 36 | srvr_name.sa_family = AF_UNIX; 37 | strcpy(srvr_name.sa_data, SOCK_NAME); 38 | 39 | rcvr_name.sa_family = AF_UNIX; 40 | strcpy(rcvr_name.sa_data, SOCK_NAME); 41 | 42 | if (bind(sock, &srvr_name, LEN_STRUCT_SOCKADDR(srvr_name)) < 0) { 43 | perror("bind failed"); 44 | return ERROR_BIND_SOCKET; 45 | } 46 | 47 | while (TRUE) { 48 | bytes = recvfrom(sock, buf, sizeof(buf), 0, &rcvr_name, &namelen); 49 | 50 | if (bytes < 0) { 51 | perror("recvfrom failed"); 52 | Cleanup(sock); 53 | return ERROR_RECVFROM_SOCKET; 54 | } 55 | 56 | printf("\n\nReceived message: %s" WHITE "\nLen = %ld\n______", buf, 57 | strlen(buf)); 58 | 59 | if (sendto(sock, buf, strlen(buf) + 1, 0, &rcvr_name, 60 | LEN_STRUCT_SOCKADDR(rcvr_name)) < 0) { 61 | perror("sendto failed"); 62 | return ERROR_SENDTO_SOCKET; 63 | } 64 | } 65 | 66 | Cleanup(sock); 67 | 68 | return OK; 69 | } 70 | -------------------------------------------------------------------------------- /sem5/lab6/report/00-title.tex: -------------------------------------------------------------------------------- 1 | \begin{titlepage} 2 | \newgeometry{pdftex, left=2cm, right=2cm, top=2.5cm, bottom=2.5cm} 3 | \fontsize{12pt}{12pt}\selectfont 4 | \noindent \begin{minipage}{0.15\textwidth} 5 | \includegraphics[width=\linewidth]{inc/img/b_logo.jpg} 6 | \end{minipage} 7 | \noindent\begin{minipage}{0.9\textwidth}\centering 8 | \textbf{Министерство науки и высшего образования Российской Федерации}\\ 9 | \textbf{Федеральное государственное бюджетное образовательное учреждение высшего образования}\\ 10 | \textbf{«Московский государственный технический университет имени Н.Э.~Баумана}\\ 11 | \textbf{(национальный исследовательский университет)»}\\ 12 | \textbf{(МГТУ им. Н.Э.~Баумана)} 13 | \end{minipage} 14 | 15 | \noindent\rule{18cm}{3pt} 16 | \newline\newline 17 | \noindent ФАКУЛЬТЕТ $\underline{\text{«Информатика и системы управления»}}$ \newline\newline 18 | \noindent КАФЕДРА $\underline{\text{«Программное обеспечение ЭВМ и информационные технологии»}}$\newline\newline\newline\newline\newline\newline\newline 19 | 20 | 21 | \begin{center} 22 | \Large\textbf{Отчет по лабораторной работе №6 по курсу <<Операционные системы>>} 23 | \end{center} 24 | 25 | \noindent\textbf{Тема} $\underline{\text{Реализация монитора Хоара «Читатели-писатели» под ОС Windows}}$\newline\newline\newline 26 | \noindent\textbf{Студент} $\underline{\text{Богаченко А.Е.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 27 | \noindent\textbf{Группа} $\underline{\text{ИУ7-56Б~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 28 | \noindent\textbf{Оценка (баллы)} $\underline{\text{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 29 | \noindent\textbf{Преподаватели} $\underline{\text{Рязанова~Н.~Ю.~~}}$\newline 30 | 31 | \begin{center} 32 | \vfill 33 | Москва~---~\the\year 34 | ~г. 35 | \end{center} 36 | \restoregeometry 37 | \end{titlepage} 38 | -------------------------------------------------------------------------------- /sem5/lab1/lab_01_2/report/00-title.tex: -------------------------------------------------------------------------------- 1 | \begin{titlepage} 2 | \newgeometry{pdftex, left=2cm, right=2cm, top=2.5cm, bottom=2.5cm} 3 | \fontsize{12pt}{12pt}\selectfont 4 | \noindent \begin{minipage}{0.15\textwidth} 5 | \includegraphics[width=\linewidth]{inc/img/b_logo.jpg} 6 | \end{minipage} 7 | \noindent\begin{minipage}{0.9\textwidth}\centering 8 | \textbf{Министерство науки и высшего образования Российской Федерации}\\ 9 | \textbf{Федеральное государственное бюджетное образовательное учреждение высшего образования}\\ 10 | \textbf{«Московский государственный технический университет имени Н.Э.~Баумана}\\ 11 | \textbf{(национальный исследовательский университет)»}\\ 12 | \textbf{(МГТУ им. Н.Э.~Баумана)} 13 | \end{minipage} 14 | 15 | \noindent\rule{18cm}{3pt} 16 | \newline\newline 17 | \noindent ФАКУЛЬТЕТ $\underline{\text{«Информатика и системы управления»}}$ \newline\newline 18 | \noindent КАФЕДРА $\underline{\text{«Программное обеспечение ЭВМ и информационные технологии»}}$\newline\newline\newline\newline\newline\newline\newline 19 | 20 | 21 | \begin{center} 22 | \Large\textbf{Отчет по лабораторной работе №1, часть 2 по курсу <<Операционные системы>>} 23 | \end{center} 24 | 25 | \noindent\textbf{Тема} $\underline{\text{Прерывание таймера в Windows и UNIX~~~~~~}}$\newline\newline\newline 26 | \noindent\textbf{Студент} $\underline{\text{Богаченко А.~Е.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 27 | \noindent\textbf{Группа} $\underline{\text{ИУ7-56Б~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 28 | \noindent\textbf{Оценка (баллы)} $\underline{\text{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline\newline 29 | \noindent\textbf{Преподаватели} $\underline{\text{Рязанова Н.Ю.~~~~~~~~~~~~~~~~~~~~~~~~~}}$\newline 30 | 31 | \begin{center} 32 | \vfill 33 | Москва~---~\the\year 34 | ~г. 35 | \end{center} 36 | \restoregeometry 37 | \end{titlepage} 38 | -------------------------------------------------------------------------------- /sem6/lab8/unix/stream/client.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | static const char* socket_path = "socket_test.soc"; 10 | static const unsigned int s_recv_len = 200; 11 | static const unsigned int s_send_len = 100; 12 | 13 | int main() 14 | { 15 | int sock = 0; 16 | int data_len = 0; 17 | struct sockaddr_un remote; 18 | char recv_msg[s_recv_len]; 19 | char send_msg[s_send_len]; 20 | 21 | memset(recv_msg, 0, s_recv_len*sizeof(char)); 22 | memset(send_msg, 0, s_send_len*sizeof(char)); 23 | 24 | if( (sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1 ) 25 | { 26 | printf("Client: Error on socket() call \n"); 27 | return 1; 28 | } 29 | 30 | remote.sun_family = AF_UNIX; 31 | strcpy( remote.sun_path, socket_path ); 32 | data_len = strlen(remote.sun_path) + sizeof(remote.sun_family); 33 | 34 | printf("Client: Trying to connect... \n"); 35 | if( connect(sock, (struct sockaddr*)&remote, data_len) == -1 ) 36 | { 37 | printf("Client: Error on connect call \n"); 38 | return 1; 39 | } 40 | 41 | printf("Client: Connected \n"); 42 | 43 | while( printf(">"), fgets(send_msg, s_send_len, stdin), !feof(stdin)) 44 | { 45 | if( send(sock, send_msg, strlen(send_msg)*sizeof(char), 0 ) == -1 ) 46 | { 47 | printf("Client: Error on send() call \n"); 48 | } 49 | memset(send_msg, 0, s_send_len*sizeof(char)); 50 | memset(recv_msg, 0, s_recv_len*sizeof(char)); 51 | 52 | if( (data_len = recv(sock, recv_msg, s_recv_len, 0)) > 0 ) 53 | { 54 | printf("Response: %s \n", recv_msg); 55 | } 56 | else 57 | { 58 | if(data_len < 0) 59 | { 60 | printf("Client: Error on recv() call \n"); 61 | } 62 | else 63 | { 64 | printf("Client: Server socket closed \n"); 65 | close(sock); 66 | break; 67 | } 68 | 69 | } 70 | } 71 | 72 | printf("Client: bye! \n"); 73 | 74 | return 0; 75 | } -------------------------------------------------------------------------------- /sem5/lab4/report/lab.tex: -------------------------------------------------------------------------------- 1 | \section*{Задание 1} 2 | 3 | Процессы-сироты. В программе создаются не менее двух потомков. В потомках вызывается {\ttfamily sleep()}. Чтобы предок гарантированно завершился раньше своих потомков. Продемонстрировать с помощью соответствующего вывода информацию об идентификаторах процессов и их группе. 4 | 5 | \begin{lstinputlisting}[ 6 | caption={Рекурсивный}, 7 | style={go}, 8 | ]{../src/1.c} 9 | \end{lstinputlisting} 10 | 11 | \img{50mm}{1}{Демонстрация работы} 12 | 13 | \section*{Задание 2} 14 | 15 | Предок ждет завершения своих потомком, используя системный вызов {\ttfamily wait()}. Вывод соответствующих сообщений на экран. 16 | 17 | \begin{lstinputlisting}[ 18 | caption={wait()}, 19 | style={go}, 20 | ]{../src/2.c} 21 | \end{lstinputlisting} 22 | 23 | \img{50mm}{2}{Демонстрация работы} 24 | 25 | \section*{Задание 3} 26 | 27 | Потомки переходят на выполнение других программ. Предок ждет завершения своих потомков. Вывод соответствующих сообщений на экран. 28 | 29 | \begin{lstinputlisting}[ 30 | caption={execlp()}, 31 | style={go}, 32 | ]{../src/3.c} 33 | \end{lstinputlisting} 34 | 35 | \img{80mm}{3}{Демонстрация работы} 36 | 37 | \section*{Задание 4} 38 | 39 | Предок и потомки обмениваются сообщениями через неименованный программный канал. Предок ждет завершения своих потомков. Вывод соответствующих сообщений на экран. 40 | 41 | \begin{lstinputlisting}[ 42 | caption={pipe}, 43 | style={go}, 44 | ]{../src/4.c} 45 | \end{lstinputlisting} 46 | 47 | \clearpage 48 | \img{80mm}{4}{Демонстрация работы} 49 | \bigskip 50 | 51 | \section*{Задание 5} 52 | 53 | Предок и потомки обмениваются сообщениями через неименованный программный канал. С помощью сигнала меняется ход выполнения программы. Предок ждет завершения своих потомков. Вывод соответствующих сообщений на экран. 54 | 55 | \begin{lstinputlisting}[ 56 | caption={Сигналы}, 57 | style={go}, 58 | ]{../src/5.c} 59 | \end{lstinputlisting} 60 | 61 | \img{70mm}{5_1}{Демонстрация работы (без сигнала)} 62 | 63 | \img{70mm}{5_2}{Демонстрация работы (с сигналом)} 64 | -------------------------------------------------------------------------------- /sem5/lab4/src/5.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | int pid; 10 | int child_pids[2]; 11 | const char volatile *msg[] = {"message1", "message2"}; 12 | 13 | int state = 0; 14 | 15 | void ignore_sigint(int sig) {} 16 | 17 | void is_writing(int sig) { state = 1; } 18 | 19 | int main() { 20 | int fd[2]; 21 | char buffer[50] = {0}; 22 | 23 | printf("Parent process: PID=%d, GROUP=%d\n", getpid(), getpgrp()); 24 | 25 | if (pipe(fd) == -1) { 26 | perror("Can't pipe\n"); 27 | return EXIT_FAILURE; 28 | } 29 | 30 | signal(SIGINT, ignore_sigint); 31 | for (size_t i = 0; i < 2; ++i) { 32 | switch (pid = fork()) { 33 | case -1: 34 | perror("Can't fork\n"); 35 | exit(EXIT_FAILURE); 36 | case 0: 37 | signal(SIGINT, is_writing); 38 | sleep(5); 39 | if (state) { 40 | close(fd[0]); 41 | write(fd[1], msg[i], strlen(msg[i])); 42 | printf("Message has been sent to parent\n"); 43 | } else { 44 | printf("No signal sent, writing will not be completed\n"); 45 | } 46 | 47 | exit(EXIT_SUCCESS); 48 | default: 49 | child_pids[i] = pid; 50 | } 51 | } 52 | 53 | for (size_t i = 0; i < 2; ++i) { 54 | int status; 55 | pid_t childpid = wait(&status); 56 | printf("Child process finished: PID = %d, status = %d\n", childpid, status); 57 | 58 | int stat_val; 59 | if (WIFEXITED(stat_val)) { 60 | printf("Child process exited with code %d\n", 61 | WEXITSTATUS(stat_val)); 62 | } else { 63 | printf("Child process terminated abnormally\n"); 64 | } 65 | } 66 | 67 | close(fd[1]); 68 | read(fd[0], buffer, sizeof(buffer)); 69 | 70 | printf("Received message: %s\n", buffer); 71 | printf("Parent process have children with IDs: %d, %d\n", child_pids[0], 72 | child_pids[1]); 73 | printf("Parent process is dead now\n"); 74 | 75 | return EXIT_SUCCESS; 76 | } -------------------------------------------------------------------------------- /sem5/lab3/report/preamble.inc.tex: -------------------------------------------------------------------------------- 1 | \usepackage{cmap} % Улучшенный поиск русских слов в полученном pdf-файле 2 | \usepackage[T2A]{fontenc} % Поддержка русских букв 3 | \usepackage[utf8]{inputenc} % Кодировка utf8 4 | \usepackage[english,russian]{babel} % Языки: русский, английский 5 | \usepackage{enumitem} 6 | \usepackage{caption} 7 | 8 | \captionsetup{labelsep=endash} 9 | \captionsetup[figure]{name=Рисунок} 10 | 11 | \usepackage{amsmath} 12 | 13 | \usepackage{geometry} 14 | \geometry{left=30mm} 15 | \geometry{right=15mm} 16 | \geometry{top=20mm} 17 | \geometry{bottom=20mm} 18 | 19 | \usepackage{titlesec} 20 | \titleformat{\section} 21 | {\normalsize\bfseries} 22 | {\thesection} 23 | {1em}{} 24 | \titlespacing*{\chapter}{0pt}{-30pt}{8pt} 25 | \titlespacing*{\section}{\parindent}{*4}{*4} 26 | \titlespacing*{\subsection}{\parindent}{*4}{*4} 27 | 28 | \usepackage{setspace} 29 | \onehalfspacing % Полуторный интервал 30 | 31 | \frenchspacing 32 | \usepackage{indentfirst} % Красная строка 33 | 34 | \usepackage{titlesec} 35 | \titleformat{\chapter}{\LARGE\bfseries}{\thechapter}{20pt}{\LARGE\bfseries} 36 | \titleformat{\section}{\Large\bfseries}{\thesection}{20pt}{\Large\bfseries} 37 | 38 | \usepackage{graphicx} 39 | \newcommand{\img}[3] { 40 | \begin{figure}[h] 41 | \center{\includegraphics[height=#1]{inc/img/#2}} 42 | \caption{#3} 43 | \label{img:#2} 44 | \end{figure} 45 | } 46 | 47 | \newcommand{\code}[1]{\texttt{#1}} 48 | 49 | \usepackage{xcolor} 50 | \usepackage{listings} 51 | 52 | \definecolor{mGreen}{rgb}{0,0.6,0} 53 | \definecolor{mGray}{rgb}{0.5,0.5,0.5} 54 | \definecolor{mPurple}{rgb}{0.58,0,0.82} 55 | \definecolor{backgroundColour}{rgb}{0.95,0.95,0.92} 56 | 57 | \lstdefinestyle{CStyle}{ 58 | backgroundcolor=\color{backgroundColour}, 59 | commentstyle=\color{mGreen}, 60 | keywordstyle=\color{magenta}, 61 | numberstyle=\tiny\color{mGray}, 62 | stringstyle=\color{mPurple}, 63 | basicstyle=\footnotesize, 64 | breakatwhitespace=false, 65 | breaklines=true, 66 | captionpos=b, 67 | keepspaces=true, 68 | numbers=left, 69 | numbersep=5pt, 70 | showspaces=false, 71 | showstringspaces=false, 72 | showtabs=false, 73 | tabsize=2, 74 | language=C 75 | } -------------------------------------------------------------------------------- /sem6/lab5/report/tex/preamble.inc.tex: -------------------------------------------------------------------------------- 1 | \usepackage{cmap} % Улучшенный поиск русских слов в полученном pdf-файле 2 | \usepackage[T2A]{fontenc} % Поддержка русских букв 3 | \usepackage[utf8]{inputenc} % Кодировка utf8 4 | \usepackage[english,russian]{babel} % Языки: русский, английский 5 | %\usepackage{pscyr} % Нормальные шрифты 6 | \usepackage{enumitem} 7 | \usepackage{array} 8 | 9 | \usepackage{verbatim} 10 | 11 | \usepackage{caption} 12 | \captionsetup{labelsep=endash} 13 | \captionsetup[figure]{name={Рисунок}} 14 | 15 | \usepackage{amsmath} 16 | 17 | \usepackage{geometry} 18 | \geometry{left=30mm} 19 | \geometry{right=15mm} 20 | \geometry{top=20mm} 21 | \geometry{bottom=20mm} 22 | 23 | \usepackage{titlesec} 24 | \titleformat{\section} 25 | {\normalsize\bfseries} 26 | {\thesection} 27 | {1em}{} 28 | \titlespacing*{\chapter}{0pt}{-30pt}{8pt} 29 | \titlespacing*{\section}{\parindent}{*4}{*4} 30 | \titlespacing*{\subsection}{\parindent}{*4}{*4} 31 | 32 | \usepackage{setspace} 33 | \onehalfspacing % Полуторный интервал 34 | 35 | \frenchspacing 36 | \usepackage{indentfirst} % Красная строка 37 | 38 | \usepackage{titlesec} 39 | \titleformat{\chapter}{\LARGE\bfseries}{\thechapter}{20pt}{\LARGE\bfseries} 40 | \titleformat{\section}{\Large\bfseries}{\thesection}{20pt}{\Large\bfseries} 41 | 42 | \usepackage{listings} 43 | \usepackage{xcolor} 44 | 45 | \lstdefinestyle{c}{ 46 | language=C, 47 | backgroundcolor=\color{white}, 48 | basicstyle=\footnotesize\ttfamily, 49 | keywordstyle=\color{blue}, 50 | stringstyle=\color{red}, 51 | commentstyle=\color{gray}, 52 | directivestyle=\color{orange}, 53 | numbers=left, 54 | numberstyle=\tiny, 55 | stepnumber=1, 56 | numbersep=5pt, 57 | frame=single, 58 | tabsize=2, 59 | captionpos=t, 60 | breaklines=true, 61 | breakatwhitespace=true, 62 | showstringspaces=false, 63 | escapeinside={\#*}{*)}, 64 | morecomment=[l][\color{magenta}]{\#}, 65 | columns=fullflexible 66 | } 67 | 68 | \usepackage{pgfplots} 69 | \usetikzlibrary{datavisualization} 70 | \usetikzlibrary{datavisualization.formats.functions} 71 | 72 | \usepackage{graphicx} 73 | 74 | \usepackage[justification=centering]{caption} % Настройка подписей float объектов 75 | 76 | \usepackage[unicode,pdftex]{hyperref} % Ссылки в pdf 77 | \hypersetup{hidelinks} 78 | 79 | \usepackage{csvsimple} 80 | 81 | \newcommand{\code}[1]{\texttt{#1}} 82 | -------------------------------------------------------------------------------- /sem6/lab6/report/tex/preamble.inc.tex: -------------------------------------------------------------------------------- 1 | \usepackage{cmap} % Улучшенный поиск русских слов в полученном pdf-файле 2 | \usepackage[T2A]{fontenc} % Поддержка русских букв 3 | \usepackage[utf8]{inputenc} % Кодировка utf8 4 | \usepackage[english,russian]{babel} % Языки: русский, английский 5 | %\usepackage{pscyr} % Нормальные шрифты 6 | \usepackage{enumitem} 7 | \usepackage{array} 8 | 9 | \usepackage{verbatim} 10 | 11 | \usepackage{caption} 12 | \captionsetup{labelsep=endash} 13 | \captionsetup[figure]{name={Рисунок}} 14 | 15 | \usepackage{amsmath} 16 | 17 | \usepackage{geometry} 18 | \geometry{left=30mm} 19 | \geometry{right=15mm} 20 | \geometry{top=20mm} 21 | \geometry{bottom=20mm} 22 | 23 | \usepackage{titlesec} 24 | \titleformat{\section} 25 | {\normalsize\bfseries} 26 | {\thesection} 27 | {1em}{} 28 | \titlespacing*{\chapter}{0pt}{-30pt}{8pt} 29 | \titlespacing*{\section}{\parindent}{*4}{*4} 30 | \titlespacing*{\subsection}{\parindent}{*4}{*4} 31 | 32 | \usepackage{setspace} 33 | \onehalfspacing % Полуторный интервал 34 | 35 | \frenchspacing 36 | \usepackage{indentfirst} % Красная строка 37 | 38 | \usepackage{titlesec} 39 | \titleformat{\chapter}{\LARGE\bfseries}{\thechapter}{20pt}{\LARGE\bfseries} 40 | \titleformat{\section}{\Large\bfseries}{\thesection}{20pt}{\Large\bfseries} 41 | 42 | \usepackage{listings} 43 | \usepackage{xcolor} 44 | 45 | \lstdefinestyle{c}{ 46 | language=C, 47 | backgroundcolor=\color{white}, 48 | basicstyle=\footnotesize\ttfamily, 49 | keywordstyle=\color{blue}, 50 | stringstyle=\color{red}, 51 | commentstyle=\color{gray}, 52 | directivestyle=\color{orange}, 53 | numbers=left, 54 | numberstyle=\tiny, 55 | stepnumber=1, 56 | numbersep=5pt, 57 | frame=single, 58 | tabsize=2, 59 | captionpos=t, 60 | breaklines=true, 61 | breakatwhitespace=true, 62 | showstringspaces=false, 63 | escapeinside={\#*}{*)}, 64 | morecomment=[l][\color{magenta}]{\#}, 65 | columns=fullflexible 66 | } 67 | 68 | \usepackage{pgfplots} 69 | \usetikzlibrary{datavisualization} 70 | \usetikzlibrary{datavisualization.formats.functions} 71 | 72 | \usepackage{graphicx} 73 | 74 | \usepackage[justification=centering]{caption} % Настройка подписей float объектов 75 | 76 | \usepackage[unicode,pdftex]{hyperref} % Ссылки в pdf 77 | \hypersetup{hidelinks} 78 | 79 | \usepackage{csvsimple} 80 | 81 | \newcommand{\code}[1]{\texttt{#1}} 82 | -------------------------------------------------------------------------------- /sem6/lab6/report/tex/lab.tex: -------------------------------------------------------------------------------- 1 | \begin{lstinputlisting}[ 2 | caption={Структура \texttt{struct filename}}, 3 | style={c}, 4 | ]{../src/struct_filename.c} 5 | \end{lstinputlisting} 6 | 7 | \begin{lstinputlisting}[ 8 | caption={Структура \texttt{struct open\_flags}}, 9 | style={c}, 10 | ]{../src/struct_open_flags.c} 11 | \end{lstinputlisting} 12 | 13 | \begin{lstinputlisting}[ 14 | caption={Структура \texttt{struct nameidata}}, 15 | style={c}, 16 | ]{../src/struct_nameidata.c} 17 | \end{lstinputlisting} 18 | 19 | \clearpage 20 | 21 | \begin{figure}[h!btp] 22 | \centering 23 | \includegraphics[width=490pt]{inc/open.pdf} 24 | \caption{Схема алгоритма работы системного вызова \texttt{open}} 25 | \end{figure} 26 | 27 | \clearpage 28 | 29 | \begin{figure}[h!btp] 30 | \centering 31 | \includegraphics[height=700pt]{inc/build_open_flags.pdf} 32 | \caption{Схема алгоритма проверки и установки флагов. Функция \texttt{build\_open\_flags}} 33 | \end{figure} 34 | 35 | \clearpage 36 | 37 | \begin{figure}[h!btp] 38 | \centering 39 | \includegraphics[width=490pt]{inc/getname_flags.pdf} 40 | \caption{Схема алгоритма копирования имени файла из пространства пользователя в пространство ядра. Функция \texttt{getname\_flags}} 41 | \end{figure} 42 | 43 | \clearpage 44 | 45 | \begin{figure}[h!btp] 46 | \centering 47 | \includegraphics[width=490pt]{inc/alloc_fd.pdf} 48 | \caption{Схема алгоритма работы функции \texttt{alloc\_fd}} 49 | \end{figure} 50 | 51 | \clearpage 52 | 53 | \begin{figure}[h!btp] 54 | \centering 55 | \includegraphics[width=490pt]{inc/path_openat.pdf} 56 | \caption{Схема алгоритма работы функции \texttt{path\_openat}} 57 | \end{figure} 58 | 59 | \clearpage 60 | 61 | \begin{figure}[h!btp] 62 | \centering 63 | \includegraphics[width=490pt]{inc/do_last.pdf} 64 | \caption{Схема алгоритма работы функции \texttt{do\_last}} 65 | \end{figure} 66 | 67 | \clearpage 68 | 69 | \begin{figure}[h!btp] 70 | \centering 71 | \includegraphics[width=490pt]{inc/lookup_open.pdf} 72 | \caption{Схема алгоритма работы функции \texttt{lookup\_open}} 73 | \end{figure} 74 | 75 | \clearpage 76 | 77 | \begin{figure}[h!btp] 78 | \centering 79 | \includegraphics[width=490pt]{inc/nameidata.pdf} 80 | \caption{Схема алгоритма работы функций \texttt{set\_nameidata} и \texttt{restore\_nameidata}} 81 | \end{figure} -------------------------------------------------------------------------------- /sem6/lab2/src/color.h: -------------------------------------------------------------------------------- 1 | #ifndef __COLOR_H__ 2 | #define __COLOR_H__ 3 | 4 | #define COLOR_RESET "\033[0m" 5 | #define COLOR_BOLD "\033[1m" 6 | #define COLOR_DIM "\033[2m" 7 | #define COLOR_UNDERLINE "\033[4m" 8 | #define COLOR_BLINK "\033[5m" 9 | #define COLOR_REVERSE "\033[7m" 10 | #define COLOR_HIDDEN "\033[8m" 11 | 12 | #define COLOR_FG_DEFAULT "\033[39m" 13 | #define COLOR_FG_GREEN "\033[32m" 14 | #define COLOR_FG_YELLOW "\033[33m" 15 | #define COLOR_FG_BLUE "\033[34m" 16 | #define COLOR_FG_MAGENTA "\033[35m" 17 | #define COLOR_FG_CYAN "\033[36m" 18 | 19 | #define COLOR_BG_DEFAULT "\033[49m" 20 | #define COLOR_BG_BLACK "\033[40m" 21 | #define COLOR_BG_RED "\033[41m" 22 | #define COLOR_BG_GREEN "\033[42m" 23 | #define COLOR_BG_YELLOW "\033[43m" 24 | #define COLOR_BG_BLUE "\033[44m" 25 | #define COLOR_BG_MAGENTA "\033[45m" 26 | #define COLOR_BG_CYAN "\033[46m" 27 | #define COLOR_BG_LIGHTGRAY "\033[47m" 28 | #define COLOR_BG_DARKGRAY "\033[100m" 29 | #define COLOR_BG_LIGHTRED "\033[101m" 30 | #define COLOR_BG_LIGHTGREEN "\033[102m" 31 | #define COLOR_BG_LIGHTYELLOW "\033[103m" 32 | #define COLOR_BG_LIGHTBLUE "\033[104m" 33 | #define COLOR_BG_LIGHTMAGENTA "\033[105m" 34 | #define COLOR_BG_LIGHTCYAN "\033[106m" 35 | 36 | #define COLOR_REG COLOR_FG_DEFAULT 37 | #define COLOR_DIR COLOR_BOLD COLOR_FG_BLUE 38 | #define COLOR_BLK COLOR_BOLD COLOR_FG_YELLOW COLOR_BG_DARKGRAY 39 | #define COLOR_CHR COLOR_BOLD COLOR_FG_YELLOW COLOR_BG_DARKGRAY 40 | #define COLOR_FIFO COLOR_FG_YELLOW COLOR_BG_DARKGRAY 41 | #define COLOR_LINK COLOR_BOLD COLOR_FG_CYAN 42 | #define COLOR_SOCK COLOR_BOLD COLOR_FG_MAGENTA 43 | #define COLOR_EXE COLOR_BOLD COLOR_FG_GREEN 44 | 45 | const int BG_SPEC_SIZE = 14; 46 | static char* BG_SPECS[] = { 47 | COLOR_BG_DEFAULT, 48 | COLOR_BG_BLACK, 49 | COLOR_BG_RED, 50 | COLOR_BG_GREEN, 51 | COLOR_BG_YELLOW, 52 | COLOR_BG_BLUE, 53 | COLOR_BG_MAGENTA, 54 | COLOR_BG_CYAN, 55 | COLOR_BG_DARKGRAY, 56 | COLOR_BG_LIGHTRED, 57 | COLOR_BG_LIGHTGREEN, 58 | COLOR_BG_LIGHTYELLOW, 59 | COLOR_BG_LIGHTBLUE, 60 | COLOR_BG_LIGHTMAGENTA, 61 | COLOR_BG_LIGHTCYAN, 62 | }; 63 | 64 | const int COLOR_LIST_SIZE = 4; 65 | static char* COLOR_LIST[] = { 66 | COLOR_BOLD, 67 | COLOR_DIM, 68 | COLOR_UNDERLINE, 69 | COLOR_BLINK, 70 | COLOR_REVERSE 71 | }; 72 | 73 | #endif 74 | -------------------------------------------------------------------------------- /sem5/lab5/rw/src/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #include "io.h" 6 | 7 | int main(void) { 8 | setbuf(stdout, NULL); 9 | int fd = shmget(IPC_PRIVATE, 10 | sizeof(int), 11 | IPC_CREAT | S_IRWXU | S_IRWXG | S_IRWXO); 12 | if (fd == -1) { 13 | perror("shmget failed!"); 14 | return EXIT_FAILURE; 15 | } 16 | 17 | int *shared_counter; 18 | if ((shared_counter = shmat(fd, 0, 0)) == (void *)-1) { 19 | perror("shmat failed!"); 20 | return EXIT_FAILURE; 21 | } 22 | 23 | int sid = semget(IPC_PRIVATE, 24 | MAX_SEMS, 25 | IPC_CREAT | S_IRWXU | S_IRWXG | S_IRWXO); 26 | if (sid == -1) { 27 | perror("semget failed!"); 28 | return EXIT_FAILURE; 29 | } 30 | 31 | semctl(sid, READER, SETVAL, 0); 32 | semctl(sid, WRITER, SETVAL, 0); 33 | semctl(sid, WRITE_QUEUE, SETVAL, 0); 34 | semctl(sid, READ_QUEUE, SETVAL, 0); 35 | 36 | int child_pid; 37 | for (short i = 0; i < READERS_COUNT; ++i) { 38 | switch ((child_pid = fork())) { 39 | case -1: 40 | perror("reader fork failed!"); 41 | exit(EXIT_FAILURE); 42 | break; 43 | case 0: 44 | reader_run(shared_counter, sid, i); 45 | return EXIT_SUCCESS; 46 | } 47 | } 48 | 49 | for (short i = 0; i < WRITERS_COUNT; ++i) { 50 | switch ((child_pid = fork())) { 51 | case -1: 52 | perror("writer fork failed!"); 53 | exit(EXIT_FAILURE); 54 | break; 55 | case 0: 56 | writer_run(shared_counter, sid, i); 57 | return EXIT_SUCCESS; 58 | } 59 | } 60 | 61 | for (short i = 0; i < WRITERS_COUNT + READERS_COUNT; ++i) { 62 | int status; 63 | if (wait(&status) == -1) { 64 | perror("children error!"); 65 | exit(EXIT_FAILURE); 66 | } 67 | 68 | if (!WIFEXITED(status)) { 69 | puts("unexpected termination"); 70 | } 71 | } 72 | 73 | if (shmdt((void *)shared_counter) == -1 || 74 | shmctl(fd, IPC_RMID, NULL) == -1 || 75 | semctl(sid, IPC_RMID, 0) == -1) { 76 | 77 | perror("exit error!"); 78 | 79 | return EXIT_FAILURE; 80 | } 81 | 82 | return EXIT_SUCCESS; 83 | } 84 | -------------------------------------------------------------------------------- /sem6/lab8/unix/stream/server.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | static const char* socket_path = "socket_test.soc"; 10 | static const unsigned int nIncomingConnections = 5; 11 | 12 | int main() { 13 | // create server side 14 | int s = 0; 15 | int s2 = 0; 16 | struct sockaddr_un local, remote; 17 | int len = 0; 18 | 19 | s = socket(AF_UNIX, SOCK_STREAM, 0); 20 | if (-1 == s) { 21 | printf("Error on socket() call \n"); 22 | return 1; 23 | } 24 | 25 | local.sun_family = AF_UNIX; 26 | strcpy(local.sun_path, socket_path); 27 | unlink(local.sun_path); 28 | len = strlen(local.sun_path) + sizeof(local.sun_family); 29 | if (bind(s, (struct sockaddr*)&local, len) != 0) { 30 | printf("Error on binding socket \n"); 31 | return 1; 32 | } 33 | 34 | if (listen(s, nIncomingConnections) != 0) { 35 | printf("Error on listen call \n"); 36 | } 37 | 38 | bool bWaiting = true; 39 | while (bWaiting) { 40 | unsigned int sock_len = 0; 41 | printf("Waiting for connection.... \n"); 42 | if ((s2 = accept(s, (struct sockaddr*)&remote, &sock_len)) == -1) { 43 | printf("Error on accept() call \n"); 44 | return 1; 45 | } 46 | 47 | printf("Server connected \n"); 48 | 49 | int data_recv = 0; 50 | char recv_buf[100]; 51 | char send_buf[200]; 52 | do { 53 | memset(recv_buf, 0, 100 * sizeof(char)); 54 | memset(send_buf, 0, 200 * sizeof(char)); 55 | data_recv = recv(s2, recv_buf, 100, 0); 56 | if (data_recv > 0) { 57 | printf("Data received: %d : %s \n", data_recv, recv_buf); 58 | strcpy(send_buf, "Got message: "); 59 | strcat(send_buf, recv_buf); 60 | 61 | if (strstr(recv_buf, "quit") != 0) { 62 | printf("Exit command received -> quitting \n"); 63 | bWaiting = false; 64 | break; 65 | } 66 | 67 | if (send(s2, send_buf, strlen(send_buf) * sizeof(char), 0) == 68 | -1) { 69 | printf("Error on send() call \n"); 70 | } 71 | } else { 72 | printf("Error on recv() call \n"); 73 | } 74 | } while (data_recv > 0); 75 | 76 | close(s2); 77 | } 78 | 79 | return 0; 80 | } 81 | -------------------------------------------------------------------------------- /sem5/lab5/pc/src/runners.c: -------------------------------------------------------------------------------- 1 | #include "runners.h" 2 | 3 | struct sembuf PROD_LOCK[2] = {{BUF_EMPTY, -1, 0}, {BIN_SEM, -1, 0}}; 4 | struct sembuf PROD_RELEASE[2] = {{BUF_FULL, 1, 0}, {BIN_SEM, 1, 0}}; 5 | 6 | struct sembuf CONS_LOCK[2] = {{BUF_FULL, -1, 0}, {BIN_SEM, -1, 0}}; 7 | struct sembuf CONS_RELEASE[2] = {{BUF_EMPTY, 1, 0}, {BIN_SEM, 1, 0}}; 8 | 9 | int run_producer(cycle_buff_t *const buffer, 10 | const int sid, 11 | const int prod_id) { 12 | if (!buffer) { 13 | return -1; 14 | } 15 | 16 | srand(time(NULL) + prod_id); 17 | 18 | int sleep_time; 19 | char ch; 20 | for (short i = 0; i < ITERATIONS_AMOUNT; ++i) { 21 | sleep_time = rand() % MAX_RANDOM_PROD + 1; 22 | sleep(sleep_time); 23 | 24 | if (semop(sid, PROD_LOCK, 2) == -1) { 25 | perror("prod lock error!"); 26 | exit(EXIT_FAILURE); 27 | } 28 | 29 | // !!! --- CRITICAL --- !!! 30 | ch = 'a' + (char)(buffer->wpos % 26); 31 | if (buff_write(buffer, ch) == -1) { 32 | perror("buffer write error!"); 33 | return EXIT_FAILURE; 34 | } 35 | printf(" Producer #%d write: %c -- idle %ds\n", prod_id, 36 | ch, sleep_time); 37 | // !!! --- CRITICAL --- !!! 38 | 39 | if (semop(sid, PROD_RELEASE, 2) == -1) { 40 | perror("prod release error!"); 41 | exit(EXIT_FAILURE); 42 | } 43 | } 44 | return EXIT_SUCCESS; 45 | } 46 | 47 | int run_consumer(cycle_buff_t *const buffer, 48 | const int sid, 49 | const int cons_id) { 50 | if (!buffer) { 51 | return -1; 52 | } 53 | 54 | srand(time(NULL) + cons_id + PROD_COUNT); 55 | 56 | int sleep_time; 57 | char ch; 58 | for (short i = 0; i < ITERATIONS_AMOUNT; ++i) { 59 | sleep_time = rand() % MAX_RANDOM_CONS + 1; 60 | sleep(sleep_time); 61 | 62 | if (semop(sid, CONS_LOCK, 2) == -1) { 63 | perror("consumer lock error!"); 64 | exit(EXIT_FAILURE); 65 | } 66 | 67 | // !!! --- CRITICAL --- !!! 68 | if (buff_read(buffer, &ch) == -1) { 69 | perror("buffer read error!"); 70 | return EXIT_FAILURE; 71 | } 72 | printf(" Consumer #%d read: %c -- idle %ds\n", cons_id, 73 | ch, sleep_time); 74 | // !!! --- CRITICAL --- !!! 75 | 76 | if (semop(sid, CONS_RELEASE, 2) == -1) { 77 | perror("consumer release error!"); 78 | exit(EXIT_FAILURE); 79 | } 80 | } 81 | return EXIT_SUCCESS; 82 | } 83 | -------------------------------------------------------------------------------- /sem5/lab5/pc/src/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | 13 | #include "buffer.h" 14 | #include "runners.h" 15 | 16 | #define MAX_SEMS 3 17 | 18 | int main(void) { 19 | setbuf(stdout, NULL); 20 | int fd = shmget(IPC_PRIVATE, 21 | sizeof(cycle_buff_t), 22 | IPC_CREAT | S_IRWXU | S_IRWXG | S_IRWXO); 23 | if (fd == -1) { 24 | perror("shmget failed!"); 25 | return EXIT_FAILURE; 26 | } 27 | 28 | cycle_buff_t *buffer; 29 | if ((buffer = shmat(fd, 0, 0)) == (void *)-1) { 30 | perror("shmat failed!"); 31 | return EXIT_FAILURE; 32 | } 33 | 34 | if (buff_init(buffer) == -1) { 35 | perror("init failed!"); 36 | return EXIT_FAILURE; 37 | } 38 | 39 | int sid = semget(IPC_PRIVATE, 40 | MAX_SEMS, 41 | IPC_CREAT | S_IRWXU | S_IRWXG | S_IRWXO); 42 | if (sid == -1) { 43 | perror("semget failed!"); 44 | return EXIT_FAILURE; 45 | } 46 | 47 | semctl(sid, BIN_SEM, SETVAL, 1); 48 | semctl(sid, BUF_EMPTY, SETVAL, N); 49 | semctl(sid, BUF_FULL, SETVAL, 0); 50 | 51 | int child_pid; 52 | for (short i = 0; i < PROD_COUNT; ++i) { 53 | switch ((child_pid = fork())) { 54 | case -1: 55 | perror("producer fork failed!"); 56 | exit(EXIT_FAILURE); 57 | break; 58 | case 0: 59 | run_producer(buffer, sid, i); 60 | return EXIT_SUCCESS; 61 | } 62 | } 63 | 64 | for (short i = 0; i < CONS_COUNT; ++i) { 65 | switch ((child_pid = fork())) { 66 | case -1: 67 | perror("consumer fork failed!"); 68 | exit(EXIT_FAILURE); 69 | break; 70 | case 0: 71 | run_consumer(buffer, sid, i); 72 | return EXIT_SUCCESS; 73 | } 74 | } 75 | 76 | for (short i = 0; i < CONS_COUNT + PROD_COUNT; ++i) { 77 | int status; 78 | if (wait(&status) == -1) { 79 | perror("children error!"); 80 | exit(EXIT_FAILURE); 81 | } 82 | if (!WIFEXITED(status)) 83 | puts("unexpected termination"); 84 | } 85 | 86 | if (shmdt((void *)buffer) == -1 || 87 | shmctl(fd, IPC_RMID, NULL) == -1 || 88 | semctl(sid, IPC_RMID, 0) == -1) { 89 | perror("exit error!"); 90 | 91 | return EXIT_FAILURE; 92 | } 93 | 94 | return EXIT_SUCCESS; 95 | } 96 | -------------------------------------------------------------------------------- /sem5/lab4/report/preamble.inc.tex: -------------------------------------------------------------------------------- 1 | \usepackage{cmap} % Улучшенный поиск русских слов в полученном pdf-файле 2 | \usepackage[T2A]{fontenc} % Поддержка русских букв 3 | \usepackage[utf8]{inputenc} % Кодировка utf8 4 | \usepackage[english,russian]{babel} % Языки: русский, английский 5 | %\usepackage{pscyr} % Нормальные шрифты 6 | \usepackage{enumitem} 7 | \usepackage{array} 8 | 9 | \usepackage{verbatim} 10 | 11 | \usepackage{caption} 12 | \captionsetup{labelsep=endash} 13 | \captionsetup[figure]{name={Рисунок}} 14 | 15 | \usepackage{amsmath} 16 | 17 | \usepackage{geometry} 18 | \geometry{left=30mm} 19 | \geometry{right=15mm} 20 | \geometry{top=20mm} 21 | \geometry{bottom=20mm} 22 | 23 | \usepackage{titlesec} 24 | \titleformat{\section} 25 | {\normalsize\bfseries} 26 | {\thesection} 27 | {1em}{} 28 | \titlespacing*{\chapter}{0pt}{-30pt}{8pt} 29 | \titlespacing*{\section}{\parindent}{*4}{*4} 30 | \titlespacing*{\subsection}{\parindent}{*4}{*4} 31 | 32 | \usepackage{setspace} 33 | \onehalfspacing % Полуторный интервал 34 | 35 | \frenchspacing 36 | \usepackage{indentfirst} % Красная строка 37 | 38 | \usepackage{titlesec} 39 | \titleformat{\chapter}{\LARGE\bfseries}{\thechapter}{20pt}{\LARGE\bfseries} 40 | \titleformat{\section}{\Large\bfseries}{\thesection}{20pt}{\Large\bfseries} 41 | 42 | \usepackage{listings} 43 | \usepackage{xcolor} 44 | 45 | \lstdefinestyle{go}{ 46 | language=C, 47 | backgroundcolor=\color{white}, 48 | basicstyle=\footnotesize\ttfamily, 49 | keywordstyle=\color{blue}, 50 | stringstyle=\color{red}, 51 | commentstyle=\color{gray}, 52 | directivestyle=\color{orange}, 53 | numbers=left, 54 | numberstyle=\tiny, 55 | stepnumber=1, 56 | numbersep=5pt, 57 | frame=single, 58 | tabsize=4, 59 | captionpos=t, 60 | breaklines=true, 61 | breakatwhitespace=true, 62 | escapeinside={\#*}{*)}, 63 | morecomment=[l][\color{magenta}]{\#}, 64 | columns=fullflexible 65 | } 66 | 67 | \usepackage{pgfplots} 68 | \usetikzlibrary{datavisualization} 69 | \usetikzlibrary{datavisualization.formats.functions} 70 | 71 | \usepackage{graphicx} 72 | \newcommand{\img}[3] { 73 | \begin{figure}[h!] 74 | \center{\includegraphics[height=#1]{inc/img/#2}} 75 | \caption{#3} 76 | \label{img:#2} 77 | \end{figure} 78 | } 79 | 80 | \newcommand{\simg}[3] { 81 | \begin{figure}[h!] 82 | \center{\includegraphics[scale=#1]{inc/img/#2}} 83 | \caption{#3} 84 | \label{img:#2} 85 | \end{figure} 86 | } 87 | 88 | \newcommand{\boximg}[3] { 89 | \begin{figure}[h] 90 | \center{\fbox{\includegraphics[height=#1]{inc/img/#2}}} 91 | \caption{#3} 92 | \label{img:#2} 93 | \end{figure} 94 | } 95 | 96 | \usepackage[justification=centering]{caption} % Настройка подписей float объектов 97 | 98 | \usepackage[unicode,pdftex]{hyperref} % Ссылки в pdf 99 | \hypersetup{hidelinks} 100 | 101 | \usepackage{csvsimple} 102 | 103 | \newcommand{\code}[1]{\texttt{#1}} 104 | -------------------------------------------------------------------------------- /sem5/lab3/report/10-impl.tex: -------------------------------------------------------------------------------- 1 | \chapter*{Задание 1} 2 | 3 | Изучение команд {\ttfamily Shell}: 4 | \begin{itemize} 5 | \item используя команду {\ttfamily mkdir} cоздайте директорию имeнем своей группы; 6 | \item перейдите в созданную директорию с помощью команды {\ttfamily cd}; 7 | \item cоздайте поддиректорию, например, используя свою фамилию; 8 | \item команда {\ttfamily ls}; 9 | \item команда {\ttfamily ps}; 10 | \end{itemize} 11 | 12 | 13 | \img{140mm}{task1}{Создание директории, поддиректории, {\ttfamily cd, ps, aux}} 14 | 15 | \chapter*{Задание 2} 16 | 17 | Процессы: 18 | \begin{itemize} 19 | \item напишите программу, в которой создается дочерний процесс и организуйте как в предке, так и в потомке бесконечные циклы, в которых выводятся идентификаторы процессов с помощью системного вызова {\ttfamily getpid()} 20 | \item запустите программу и посмотрите идентификаторы созданных процессов: предка и потомка; 21 | \item для получения процесса зомби выполните следующие действия: a) удалите командой {\ttfamily kill} потомка ипосмотрите с помощью команды {\ttfamily ps} его новый статус – Z; b) удалите предка; 22 | \item для получения ``осиротевшего`` процесса запустите программу еще раз, но в этот раз удалите предка и посмотрите с помощью команды ps идентификатор предкка у продолжающего выполнятьсяпотомка -- идентификатор предка будет изменен на 1, так как процесс был ``усыновлен`` процессом с идентификатором 1 процессом ``открывшим`` терминал в случае, если используется {\ttfamily Unix BSD}, илиидентификатор процессов-посредников в случае, {\ttfamily Linux Ubuntu}. 23 | \end{itemize} 24 | 25 | \begin{lstlisting}[style=CStyle] 26 | #include 27 | #include 28 | #include 29 | int main(void) { 30 | int childpid; 31 | if ((childpid = fork()) == -1) { 32 | perror("Can't fork.\n"); 33 | return EXIT_FAILURE; 34 | } else if (childpid == 0) { 35 | while (1) { 36 | printf("child pid = %d\n", getpid()); 37 | } 38 | return EXIT_SUCCESS; 39 | } else { 40 | while (1) { 41 | printf("parent pid = %d\n", getpid()); 42 | } 43 | return 0; 44 | } 45 | } 46 | \end{lstlisting} 47 | 48 | \img{50mm}{task2-run}{Вывод программы} 49 | 50 | \img{90mm}{task2-zombie}{Создание процесса {\ttfamily zombie}} 51 | 52 | \chapter*{Задание 3} 53 | 54 | Продемонстрировать работу {\ttfamily pipe}: 55 | \begin{itemize} 56 | \item создание и запись в {\ttfamily pipe}; 57 | \item чтение из {\ttfamily pipe}. 58 | \end{itemize} 59 | 60 | \img{50mm}{task3-write}{Создание и запись в {\ttfamily pipe}} 61 | 62 | \img{29mm}{task3-read}{Чтение из {\ttfamily pipe}} 63 | 64 | \chapter*{Задание 4} 65 | 66 | Изучение {\ttfamily softlink} и {\ttfamily hardlink}: 67 | \begin{itemize} 68 | \item создать {\ttfamily hardlink}; 69 | \item создать и изменить {\ttfamily softlink}. 70 | \end{itemize} 71 | 72 | \img{85mm}{task4-hardlink}{Создание {\ttfamily hardlink}} 73 | 74 | \img{85mm}{task4-softlink}{Создание и изменение {\ttfamily softlink}} 75 | 76 | \chapter*{Задача 5} 77 | 78 | Изменить приоритет любого процесса. 79 | 80 | \img{85mm}{NI}{Изменение приоритета процесса} 81 | -------------------------------------------------------------------------------- /sem5/lab5/report/preamble.inc.tex: -------------------------------------------------------------------------------- 1 | \usepackage{cmap} % Улучшенный поиск русских слов в полученном pdf-файле 2 | \usepackage[T2A]{fontenc} % Поддержка русских букв 3 | \usepackage[utf8]{inputenc} % Кодировка utf8 4 | \usepackage[english,russian]{babel} % Языки: русский, английский 5 | \usepackage{verbatim} 6 | 7 | \usepackage{caption} 8 | \captionsetup{labelsep=endash} 9 | \captionsetup[figure]{name={Рисунок}} 10 | 11 | \usepackage{amsmath} 12 | 13 | \usepackage{geometry} 14 | \geometry{left=30mm} 15 | \geometry{right=15mm} 16 | \geometry{top=20mm} 17 | \geometry{bottom=20mm} 18 | 19 | \usepackage{titlesec} 20 | \titleformat{\section} 21 | {\normalsize\bfseries} 22 | {\thesection} 23 | {1em}{} 24 | \titlespacing*{\chapter}{0pt}{-30pt}{8pt} 25 | \titlespacing*{\section}{\parindent}{*4}{*4} 26 | \titlespacing*{\subsection}{\parindent}{*4}{*4} 27 | 28 | \usepackage{setspace} 29 | \onehalfspacing % Полуторный интервал 30 | 31 | \frenchspacing 32 | \usepackage{indentfirst} % Красная строка 33 | 34 | \usepackage{titlesec} 35 | \titleformat{\chapter}{\LARGE\bfseries}{\thechapter}{20pt}{\LARGE\bfseries} 36 | \titleformat{\section}{\Large\bfseries}{\thesection}{20pt}{\Large\bfseries} 37 | 38 | \usepackage{xcolor} 39 | \usepackage{listings} 40 | 41 | \definecolor{mGreen}{rgb}{0,0.6,0} 42 | \definecolor{mGray}{rgb}{0.5,0.5,0.5} 43 | \definecolor{mPurple}{rgb}{0.58,0,0.82} 44 | \definecolor{backgroundColour}{rgb}{0.95,0.95,0.92} 45 | 46 | \lstdefinestyle{CStyle}{ 47 | backgroundcolor=\color{backgroundColour}, 48 | commentstyle=\color{mGreen}, 49 | keywordstyle=\color{magenta}, 50 | numberstyle=\tiny\color{mGray}, 51 | stringstyle=\color{mPurple}, 52 | basicstyle=\footnotesize, 53 | breakatwhitespace=false, 54 | escapeinside={\#*}{*)}, 55 | breaklines=true, 56 | captionpos=b, 57 | keepspaces=true, 58 | numbers=left, 59 | numbersep=5pt, 60 | showspaces=false, 61 | showstringspaces=false, 62 | showtabs=false, 63 | tabsize=2, 64 | language=C 65 | } 66 | 67 | \usepackage{pgfplots} 68 | \usetikzlibrary{datavisualization} 69 | \usetikzlibrary{datavisualization.formats.functions} 70 | 71 | \usepackage{graphicx} 72 | \newcommand{\img}[3] { 73 | \begin{figure}[h!] 74 | \center{\includegraphics[height=#1]{inc/img/#2}} 75 | \caption{#3} 76 | \label{img:#2} 77 | \end{figure} 78 | } 79 | 80 | \newcommand{\simg}[3] { 81 | \begin{figure}[h!] 82 | \center{\includegraphics[scale=#1]{inc/img/#2}} 83 | \caption{#3} 84 | \label{img:#2} 85 | \end{figure} 86 | } 87 | 88 | \newcommand{\boximg}[3] { 89 | \begin{figure}[h] 90 | \center{\fbox{\includegraphics[height=#1]{inc/img/#2}}} 91 | \caption{#3} 92 | \label{img:#2} 93 | \end{figure} 94 | } 95 | 96 | \usepackage[justification=centering]{caption} % Настройка подписей float объектов 97 | 98 | \usepackage[unicode,pdftex]{hyperref} % Ссылки в pdf 99 | \hypersetup{hidelinks} 100 | 101 | 102 | \newcommand{\code}[1]{\texttt{#1}} 103 | -------------------------------------------------------------------------------- /sem5/lab6/report/preamble.inc.tex: -------------------------------------------------------------------------------- 1 | \usepackage{cmap} % Улучшенный поиск русских слов в полученном pdf-файле 2 | \usepackage[T2A]{fontenc} % Поддержка русских букв 3 | \usepackage[utf8]{inputenc} % Кодировка utf8 4 | \usepackage[english,russian]{babel} % Языки: русский, английский 5 | \usepackage{verbatim} 6 | 7 | \usepackage{caption} 8 | \captionsetup{labelsep=endash} 9 | \captionsetup[figure]{name={Рисунок}} 10 | 11 | \usepackage{amsmath} 12 | 13 | \usepackage{geometry} 14 | \geometry{left=30mm} 15 | \geometry{right=15mm} 16 | \geometry{top=20mm} 17 | \geometry{bottom=20mm} 18 | 19 | \usepackage{titlesec} 20 | \titleformat{\section} 21 | {\normalsize\bfseries} 22 | {\thesection} 23 | {1em}{} 24 | \titlespacing*{\chapter}{0pt}{-30pt}{8pt} 25 | \titlespacing*{\section}{\parindent}{*4}{*4} 26 | \titlespacing*{\subsection}{\parindent}{*4}{*4} 27 | 28 | \usepackage{setspace} 29 | \onehalfspacing % Полуторный интервал 30 | 31 | \frenchspacing 32 | \usepackage{indentfirst} % Красная строка 33 | 34 | \usepackage{titlesec} 35 | \titleformat{\chapter}{\LARGE\bfseries}{\thechapter}{20pt}{\LARGE\bfseries} 36 | \titleformat{\section}{\Large\bfseries}{\thesection}{20pt}{\Large\bfseries} 37 | 38 | \usepackage{xcolor} 39 | \usepackage{listings} 40 | 41 | \definecolor{mGreen}{rgb}{0,0.6,0} 42 | \definecolor{mGray}{rgb}{0.5,0.5,0.5} 43 | \definecolor{mPurple}{rgb}{0.58,0,0.82} 44 | \definecolor{backgroundColour}{rgb}{0.95,0.95,0.92} 45 | 46 | \lstdefinestyle{CStyle}{ 47 | backgroundcolor=\color{backgroundColour}, 48 | commentstyle=\color{mGreen}, 49 | keywordstyle=\color{magenta}, 50 | numberstyle=\tiny\color{mGray}, 51 | stringstyle=\color{mPurple}, 52 | basicstyle=\footnotesize, 53 | breakatwhitespace=false, 54 | escapeinside={\#*}{*)}, 55 | breaklines=true, 56 | captionpos=b, 57 | keepspaces=true, 58 | numbers=left, 59 | numbersep=5pt, 60 | showspaces=false, 61 | showstringspaces=false, 62 | showtabs=false, 63 | tabsize=2, 64 | language=C 65 | } 66 | 67 | \usepackage{pgfplots} 68 | \usetikzlibrary{datavisualization} 69 | \usetikzlibrary{datavisualization.formats.functions} 70 | 71 | \usepackage{graphicx} 72 | \newcommand{\img}[3] { 73 | \begin{figure}[h!] 74 | \center{\includegraphics[height=#1]{inc/img/#2}} 75 | \caption{#3} 76 | \label{img:#2} 77 | \end{figure} 78 | } 79 | 80 | \newcommand{\simg}[3] { 81 | \begin{figure}[h!] 82 | \center{\includegraphics[scale=#1]{inc/img/#2}} 83 | \caption{#3} 84 | \label{img:#2} 85 | \end{figure} 86 | } 87 | 88 | \newcommand{\boximg}[3] { 89 | \begin{figure}[h] 90 | \center{\fbox{\includegraphics[height=#1]{inc/img/#2}}} 91 | \caption{#3} 92 | \label{img:#2} 93 | \end{figure} 94 | } 95 | 96 | \usepackage[justification=centering]{caption} % Настройка подписей float объектов 97 | 98 | \usepackage[unicode,pdftex]{hyperref} % Ссылки в pdf 99 | \hypersetup{hidelinks} 100 | 101 | 102 | \newcommand{\code}[1]{\texttt{#1}} 103 | -------------------------------------------------------------------------------- /sem5/lab5/rw/src/io.c: -------------------------------------------------------------------------------- 1 | #include "io.h" 2 | 3 | struct sembuf READER_QUEUE[] = { 4 | {READ_QUEUE, 1, 0}, 5 | {WRITER, 0, 0}, 6 | {WRITE_QUEUE, 0, 0}, 7 | }; 8 | 9 | struct sembuf READER_LOCK[] = { 10 | {READER, 1, 0}, 11 | {READ_QUEUE, -1, 0}, 12 | }; 13 | 14 | struct sembuf READER_RELEASE[] = { 15 | {READER, -1, 0}, 16 | }; 17 | 18 | struct sembuf WRITER_QUEUE[] = { 19 | {WRITE_QUEUE, 1, 0}, 20 | {READER, 0, 0}, 21 | {WRITER, 0, 0}, 22 | }; 23 | 24 | struct sembuf WRITER_LOCK[] = { 25 | {WRITER, 1, 0}, 26 | {WRITE_QUEUE, -1, 0}, 27 | }; 28 | 29 | struct sembuf WRITER_RELEASE[] = { 30 | {WRITER, -1, 0}, 31 | }; 32 | 33 | static inline int start_read(int sid) { 34 | return semop(sid, READER_QUEUE, 3) != -1 && 35 | semop(sid, READER_LOCK, 2) != -1; 36 | } 37 | static inline int stop_read(int sid) { 38 | return semop(sid, READER_RELEASE, 1) != -1; 39 | } 40 | 41 | int reader_run(int *const shared_counter, 42 | const int sid, 43 | const int reader_id) { 44 | if (!shared_counter) { 45 | return -1; 46 | } 47 | 48 | srand(time(NULL) + reader_id); 49 | 50 | int sleep_time; 51 | for (short i = 0; i < ITERATIONS; ++i) { 52 | sleep_time = rand() % MAX_RANDOM + 1; 53 | sleep(sleep_time); 54 | 55 | if (!start_read(sid)) { 56 | perror("Something went wrong with start_read!"); 57 | exit(EXIT_FAILURE); 58 | } 59 | 60 | // !!! --- CRITICAL --- !!! 61 | int val = *shared_counter; 62 | printf(" Reader #%d read: %3d -- idle %ds\n", reader_id, 63 | val, sleep_time); 64 | // !!! --- CRITICAL --- !!! 65 | 66 | if (!stop_read(sid)) { 67 | perror("Something went wrong with stop_read!"); 68 | exit(EXIT_FAILURE); 69 | } 70 | } 71 | return EXIT_SUCCESS; 72 | } 73 | 74 | static inline int write_start(int sid) { 75 | return semop(sid, WRITER_QUEUE, 3) != -1 && 76 | semop(sid, WRITER_LOCK, 2) != -1; 77 | } 78 | 79 | static inline int write_stop(int sid) { 80 | return semop(sid, WRITER_RELEASE, 1) != -1; 81 | } 82 | 83 | int writer_run(int *const shared_counter, 84 | const int sid, 85 | const int writer_id) { 86 | if (!shared_counter) { 87 | return -1; 88 | } 89 | 90 | srand(time(NULL) + writer_id + READERS_COUNT); 91 | 92 | int sleep_time; 93 | for (short i = 0; i < ITERATIONS; ++i) { 94 | sleep_time = rand() % MAX_RANDOM + 1; 95 | sleep(sleep_time); 96 | 97 | if (!write_start(sid)) { 98 | perror("Something went wrong with write_start!"); 99 | exit(EXIT_FAILURE); 100 | } 101 | 102 | // !!! --- CRITICAL --- !!! 103 | int val = ++(*shared_counter); 104 | printf(" Writer #%d write: %3d -- idle %ds\n", writer_id, 105 | val, sleep_time); 106 | // !!! --- CRITICAL --- !!! 107 | 108 | if (!write_stop(sid)) { 109 | perror("Something went wrong with write_stop!"); 110 | exit(EXIT_FAILURE); 111 | } 112 | } 113 | 114 | return EXIT_SUCCESS; 115 | } 116 | -------------------------------------------------------------------------------- /sem5/lab2/src/my_macro.inc: -------------------------------------------------------------------------------- 1 | ; far_jump на сегмент, смещение 2 | far_jump macro label, segment 3 | db 0EAh 4 | dd offset label 5 | dw segment 6 | endm 7 | 8 | ; печать строки на экран 9 | print_str macro str 10 | mov ah, 09h 11 | lea dx, str 12 | int 21h 13 | xor dx, dx 14 | mov ah, 2 15 | mov dl, 13 16 | int 21h 17 | mov dl, 10 18 | int 21h 19 | endm 20 | 21 | ; ожидание ввода символа с клавиатуры 22 | wait_key macro 23 | push eax 24 | mov ah, 10h 25 | int 16h 26 | pop eax 27 | endm 28 | 29 | ; очистить экран 30 | clear_screen macro 31 | mov ax, 3 32 | int 10h 33 | endm 34 | 35 | ; загружаем дескриптор в таблицу 36 | load_gdt macro gdt_desc 37 | shl eax, 4 ; eax - линейный базовый адрес (*2^4 = 16) (в eax был seg => он выравнен по параграфу => линейный адрес seg * 16) 38 | mov word ptr gdt_desc.base_l, ax ; загрузка младшей часть базы 39 | shr eax, 16 ; старшую половину eax в ax 40 | mov byte ptr gdt_desc.base_m, al ; загрузка средней часть базы 41 | mov byte ptr gdt_desc.base_h, ah ; загрузка старшей часть базы 42 | endm 43 | 44 | ; загружает в регистр gdtr лин баз адрес gdt и ее размер 45 | init_gdtr macro reg ; в reg полный линейный адрес GDT 46 | mov dword ptr gdtr + 2, reg ; кладём полный линейный адрес в старшие 4 байта переменной gdtr 47 | mov word ptr gdtr, gdt_size-1 ; в младшие 2 байта заносим размер gdt, из-за определения gdt_size (через $) настоящий размер на 1 байт меньше 48 | lgdt fword ptr gdtr ; загрузим GDT 49 | endm 50 | 51 | load_idt macro idt_desc 52 | mov idt_desc.offs_l, ax ; загрузить младшую часть смещения 53 | shr eax, 16 ; переместить старшую часть в младшую 54 | mov idt_desc.offs_h, ax ; загрузить старшую часть смещения 55 | endm 56 | 57 | init_idtr macro reg ; в reg полный линейный адрес IDT 58 | mov dword ptr idtr + 2, reg ; загрузить полный линейный адрес в старшие 4 байта переменной idtr 59 | mov word ptr idtr, idt_size-1 ; в младшие 2 байта заносим размер idt 60 | endm 61 | 62 | ;перепрограммируем контроллер 63 | set_interrupt_base macro base 64 | ; чтобы начать инициализацию пик, нужно на порт команды 20h отправить команду 11h 65 | ; она заставляет контроллер ждать слова инициализации 66 | mov al, 11h ; команда - инициализировать ведущий контроллер 67 | out 20h, al ; отправить команду по шине данных ведущему контроллеру 68 | 69 | ; отправляем новый базовый лин адрес 70 | mov al, base ; базовый вектор (начальное смещение для обработчика) установить в 32 71 | out 21h, al ; отправить базовый вектор ведущему контроллеру 72 | 73 | mov al, 4 ; 4 = 0000 0100 74 | out 21h, al ; сообщить mask_master PIC, что mask_slave подключён к IRQ2 75 | 76 | ; 77 | mov al, 1 ; указываем, что нужно будет посылать 78 | out 21h, al ; команду завершения обработчика прерывания 79 | endm 80 | 81 | mem_str macro 82 | mov dI, 0 83 | mov ah, 00000110b 84 | mov al, 'M' 85 | stosw 86 | mov al, 'e' 87 | stosw 88 | mov al, 'm' 89 | stosw 90 | mov al, 'o' 91 | stosw 92 | mov al, 'r' 93 | stosw 94 | mov al, 'y' 95 | stosw 96 | mov al, ':' 97 | stosw 98 | endm 99 | 100 | 101 | -------------------------------------------------------------------------------- /sem5/lab1/README.md: -------------------------------------------------------------------------------- 1 | ## Некоторые вопросы к защите 2 | 3 | ### Что находится по адресу 40h? 4 | 5 | Область данных BIOS. 6 | 7 | ### Зачем мы в ES заносим 0? Что там расположено? 8 | 9 | По 0 адресу распологается таблица веторов прерываний IDT. 10 | 11 | ### В чём смысл последовательности вызовов 1Ch - sub_1 - EOI 12 | 13 | Смысл в том, что так как у нас приоритет у INT 8h высокий и оно вызывается очень часто (18.2 в секунду) нам важно, чтобы флаги не наложились друг на друга (т.е. чтобы не вызывался один iret во время работы второго). 14 | 15 | ### Для чего сбрасывается контроллер прервывания? 16 | 17 | Чтобы позволить прерываниям меньшего приоритета обрабатываться. 18 | 19 | ### Как по научному называются 4 push в конце прерывания? 20 | 21 | Сохранение аппаратного контекста. 22 | 23 | ### Как получили адрес обработчика прерывания? 24 | 25 | Таблица векторов прерываний (IDT) в DOS расположена по нулевому адресу. Зная номер прерывания, можно получить смещение в этой таблице, по которому расположен дальний (far) адрес обработчика прерывания. Размер дальнего адреса - 4 байта (2 на сегмент и 2 на смещение). Например, для 8 прерывания смещение = 8 * 4 = 32. Надо иметь в виду, что в x86 используется обратный порядок записи байтов (little endian), поэтому если таблица векторов прерываний получена в виде массива байтов, то для получения шестнадцатеричного адреса необходимо перевернуть расположенные по найденному смещению 4 байта. 26 | 27 | ### Как называется такое действие в системе как отключение моторчика дисковода? 28 | 29 | Отложенное действие, диску требуется время, приводит к временным затратам. 30 | 31 | ### Как получить реальное время, если известен адрес, по которому хранится число тиков с момента старта системы? 32 | 33 | Поделить число тиков на 18.2 - получим время в миллисекундах. (делим на 1000 получаем секунды, делим на 60 получаем минуты). 34 | 35 | ### Как называется команда call dword ptr es:[70h] 36 | 37 | Косвенный вызов. 38 | 39 | ### Что находится внутри обработчика прерывания 1Ch? 40 | 41 | Это заглушка, внутри просто iret. 42 | 43 | ### Почему в коде декремента счетчика задержки отключения моторчика дисковода нет проверки, что в счетчике 0? 44 | 45 | Чтобы не выполнять лишние операции (для быстродействия). 46 | 47 | ### Что такое маскируемые и не маскируемые прерывания? 48 | 49 | Маскируемые вызываются по маске - соответственно вызов таких прерываний можно запретить. Не маскируемые запретить нельзя, такими могут быть ошибки различные. 50 | 51 | ### По какой шине передается маска маскируемого прерывания? 52 | 53 | По шине данных, так как маска является данным. 54 | 55 | ### Что значит каждая из колонок листинга? 56 | (слева - направо) адреса (сегмент-смещение!), машинный код, команды ассемблера, комментарии. 57 | 58 | ### Что за флаг IF? 59 | 60 | Interrupt flag - флаг прерывания - 1=разрешено, 0=запрещено. 61 | 62 | ### Зачем нужно прерывание 1Ch, если есть 8h? 63 | 64 | 1Ch – программное прерывание, а 8h — аппаратное. Если изменять код аппаратного, оно будет выполняться долго, а так как в doc у int8h самый высокий приоритет, то все процессорное время будет занято выполнением кода int8h. 65 | 66 | ### Что это за адрес - 0040:0314h ? 67 | 68 | Область данных биос, там содержится копия флагов. 69 | 70 | ### Что делает префиксная команда lock? 71 | 72 | Указывает на то, что следующее за ней команда должна выполняться, как неделимая. Прервать выполнение след за lock команды нельзя. Технически это осуществляется блокировкой локальной шины памяти. На время выполнения команды блокируется локальная шина памяти. 73 | 74 | ### Почему lock перед and? 75 | 76 | Связано с особенностью работы and, операция объёмная и требует много времени. -------------------------------------------------------------------------------- /sem6/lab8/inet/server.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | #define MAX_CLIENTS_AMOUNT 10 12 | #define SOCKET_PORT 8888 13 | #define BUF_SIZE 256 14 | 15 | #define MAX_CLIENTS_ERROR 2 16 | 17 | int main(void) { 18 | int clients[MAX_CLIENTS_AMOUNT] = { 0 }; 19 | int sfd; 20 | if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 21 | perror("socket call error"); 22 | return errno; 23 | } 24 | struct sockaddr_in addr = { 25 | .sin_family = AF_INET, 26 | .sin_addr.s_addr = INADDR_ANY, 27 | .sin_port = htons(SOCKET_PORT) 28 | }; 29 | memset(addr.sin_zero, 0, sizeof(addr.sin_zero)); 30 | if (bind(sfd, (struct sockaddr*)&addr, sizeof addr) == -1) { 31 | close(sfd); 32 | perror("bind call error"); 33 | return errno; 34 | } 35 | if (listen(sfd, MAX_CLIENTS_AMOUNT) == -1) { 36 | close(sfd); 37 | perror("listen call error"); 38 | return errno; 39 | } 40 | printf("Server is running on %s:%d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); 41 | 42 | char msg[BUF_SIZE]; 43 | fd_set readfds; 44 | FD_ZERO(&readfds); 45 | 46 | for (;;) { 47 | FD_SET(sfd, &readfds); 48 | int max_sd = sfd; 49 | for (int i = 0; i < MAX_CLIENTS_AMOUNT; ++i) { 50 | if (clients[i] > 0) 51 | FD_SET(clients[i], &readfds); 52 | if (clients[i] > max_sd) 53 | max_sd = clients[i]; 54 | } 55 | 56 | if (pselect(max_sd + 1, &readfds, NULL, NULL, NULL, NULL) == -1) { 57 | close(sfd); 58 | perror("pselect call error"); 59 | return errno; 60 | } 61 | 62 | if (FD_ISSET(sfd, &readfds)) { 63 | struct sockaddr_in addr; 64 | socklen_t len; 65 | memset(addr.sin_zero, 0, sizeof(addr.sin_zero)); 66 | const int client_fd = accept(sfd, (struct sockaddr*) &addr, &len); 67 | printf("New connect from %s:%d\n", inet_ntoa(addr.sin_addr), addr.sin_port); 68 | if (client_fd == -1) { 69 | close(sfd); 70 | perror("accept call error"); 71 | exit(errno); 72 | } 73 | int not_set = 1; 74 | for (int i = 0; not_set && i < MAX_CLIENTS_AMOUNT; ++i) { 75 | if (!clients[i]) { 76 | clients[i] = client_fd; 77 | printf("New client created #%d (with fd = %d)\n", i, client_fd); 78 | not_set = 0; 79 | } 80 | } 81 | if (not_set) { 82 | close(sfd); 83 | fprintf(stderr, "Reached max amount of clients, exiting!"); 84 | exit(MAX_CLIENTS_ERROR); 85 | } 86 | } 87 | 88 | for (int i = 0; i < MAX_CLIENTS_AMOUNT; ++i) 89 | if (clients[i] && FD_ISSET(clients[i], &readfds)) { 90 | size_t bytes = recv(clients[i], &msg, BUF_SIZE, 0); 91 | if (!bytes) { 92 | fprintf(stderr, "client #%d (with fd = %d) disconnected\n", i, clients[i]); 93 | FD_CLR(clients[i], &readfds); 94 | close(clients[i]); 95 | clients[i] = 0; 96 | } else { 97 | msg[bytes] = '\0'; 98 | printf("Got message from client #%d (with fd = %d): %s\n", i, clients[i], msg); 99 | } 100 | } 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /sem5/lab1/lab_01_1/report/inc/src/int8h.asm: -------------------------------------------------------------------------------- 1 | ;; Вызов процедуры sub_1 2 | 020A:0746 E8 0070 call sub_1 ; (07B9) 3 | 4 | ;; Сохранение регистров ES, DS, AX, DX 5 | 020A:0749 06 push es 6 | 020A:074A 1E push ds 7 | 020A:074B 50 push ax 8 | 020A:074C 52 push dx 9 | 10 | ;; Установка сегмента данных 11 | 020A:074D B8 0040 mov ax,40h 12 | 020A:0750 8E D8 mov ds,ax ; Настройка ds 13 | 020A:0752 33 C0 xor ax,ax ; Zero register 14 | 020A:0754 8E C0 mov es,ax ; Настройка es 15 | 16 | ;; Инкремент счётчика реального времени по известному адресу в области данных BIOS 17 | ;; Инкремент двух младших байтов счётчика реального времени по адресу 0040:006C 18 | 020A:0756 FF 06 006C inc word ptr ds:[6Ch] ; (0040:006C=0E873h) 19 | 020A:075A 75 04 jnz loc_1 ; Jump if not zero 20 | ;; Инкремент двух старших байтов счётчика реального времени по адресу 0040:006E 21 | 020A:075C FF 06 006E inc word ptr ds:[6Eh] ; (0040:006E=0Ch) 22 | 23 | ;; Сброс счётчика реального времени при наступлении новых суток 24 | 020A:0760 loc_1: 25 | 020A:0760 83 3E 006E 18 cmp word ptr ds:[6Eh],18h ; (0040:006E=0Ch) 26 | 020A:0765 75 15 jne loc_2 ; Jump if not equal 27 | 020A:0767 81 3E 006C 00B0 cmp word ptr ds:[6Ch],0B0h; (0040:006C=0E873h) 28 | 020A:076D 75 0D jne loc_2 ; Jump if not equal 29 | ;; Обнуление двух старших байтов счётчика реального времени по адресу 0040:006E 30 | 020A:076F A3 006E mov word ptr ds:[6Eh],ax ; (0040:006E=0Ch) 31 | ;; Обнуление двух младших байтов счётчика реального времени по адресу 0040:006C 32 | 020A:0772 A3 006C mov word ptr ds:[6Ch],ax ; (0040:006C=0E873h) 33 | ;; Установка флага прошедших суток по адресу 0040:0070 34 | 020A:0775 C6 06 0070 01 mov byte ptr ds:[70h],1 ; (0040:0070=0) 35 | 020A:077A 0C 08 or al,8 36 | 37 | ;; Декремент счётчика времени до отключения моторчика дисковода по известному адресу в области данных BIOS 38 | 020A:077C loc_2: 39 | 020A:077C 50 push ax 40 | 020A:077D FE 0E 0040 dec byte ptr ds:[40h] ; (0040:0040=2Bh) 41 | 020A:0781 75 0B jnz loc_3 ; Jump if not zero 42 | ;; Установка флага отключения моторчика дисковода 43 | 020A:0783 80 26 003F F0 and byte ptr ds:[3Fh],0F0h ; (0040:003F=0) 44 | ;; Посылание команды отключения OCh в порт дисковода 3F2h 45 | 020A:0788 B0 0C mov al,0Ch 46 | 020A:078A BA 03F2 mov dx,3F2h 47 | 020A:078D EE out dx,al ; port 3F2h, dsk0 contrl output 48 | 49 | ;; Вызов прерывания 1Ch 50 | 020A:078E loc_3: 51 | 020A:078E 58 pop ax 52 | ;; Установлен ли флаг разрешения прерываний IF? 53 | 020A:078F F7 06 0314 0004 test word ptr ds:[314h],4 ; (0040:0314=3200h) 54 | 020A:0795 75 0C jnz loc_4 ; Jump if not zero 55 | ;; Косвенный вызов прерывания 1Ch 56 | 020A:0797 9F lahf ; Load ah from flags 57 | 020A:0798 86 E0 xchg ah,al 58 | 020A:079A 50 push ax 59 | 020A:079B 26: FF 1E 0070 call dword ptr es:[70h] ; (0000:0070=6ADh) 60 | 020A:07A0 EB 03 jmp short loc_5 ; (07A5) 61 | 020A:07A2 90 nop 62 | ;; Вызов прерывания 1Сh 63 | 020A:07A3 loc_4: 64 | 020A:07A3 CD 1C int 1Ch ; Timer break (call each 18.2ms) 65 | 66 | ;; Вызов процедуры sub_1 67 | 020A:07A5 loc_5: 68 | 020A:07A5 E8 0011 call sub_1 ; (07B9) 69 | 70 | ;; Сброс контроллера прерываний записью 20h в порт 20h 71 | 020A:07A8 B0 20 mov al,20h ; ' ' 72 | 020A:07AA E6 20 out 20h,al ; port 20h, 8259-1 int command 73 | ; al = 20h, end of interrupt 74 | 75 | ;; Восстановление регистров DX, AX, DS, ES 76 | 020A:07AC 5A pop dx 77 | 020A:07AD 58 pop ax 78 | 020A:07AE 1F pop ds 79 | 020A:07AF 07 pop es 80 | 81 | ;; Завершение обработчика прерывания 8h 82 | 020A:07B0 E9 FE99 jmp $-164h ; (07B0-164=064C) 83 | 84 | 020A:064C 1E push ds 85 | 020A:064D 50 push ax 86 | ; ... 87 | 020A:06AA 58 pop ax 88 | 020A:06AB 1F pop ds 89 | 020A:06AC CF iret ; Interrupt return 90 | -------------------------------------------------------------------------------- /sem6/lab4/part2/fortune.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | MODULE_LICENSE("GPL"); 9 | MODULE_AUTHOR("Bogachenko Artem"); 10 | 11 | #define MAX_BUF_SIZE PAGE_SIZE 12 | 13 | #define DIRNAME "fortunes" 14 | #define FILENAME "fortune" 15 | #define SYMLINK "fortune_link" 16 | #define FILEPATH DIRNAME "/" FILENAME 17 | 18 | static struct proc_dir_entry *fortune_dir = NULL; 19 | static struct proc_dir_entry *fortune_file = NULL; 20 | static struct proc_dir_entry *fortune_link = NULL; 21 | 22 | static char *cookie_buffer; 23 | static int next_index; 24 | static int current_fortune; 25 | 26 | static char tmp[MAX_BUF_SIZE]; 27 | 28 | ssize_t fortune_read(struct file *filp, char __user *buf, size_t count, loff_t *offp) { 29 | int len; 30 | printk("+: read called\n"); 31 | if (*offp > 0 || !next_index) { 32 | printk("+: offp case"); 33 | return 0; 34 | } 35 | if (current_fortune >= next_index) 36 | current_fortune = 0; 37 | len = snprintf(tmp, MAX_BUF_SIZE, "%s\n", &cookie_buffer[current_fortune]); 38 | if (copy_to_user(buf, tmp, len)) { 39 | printk(KERN_ERR "+: copy_to_user error\n"); 40 | return -EFAULT; 41 | } 42 | current_fortune += len; 43 | *offp += len; 44 | return len; 45 | } 46 | 47 | ssize_t fortune_write(struct file *filp, const char __user *buf, size_t len, loff_t *offp) { 48 | if (len > MAX_BUF_SIZE - next_index +1) { 49 | printk(KERN_ERR "+: cookie_buffer overflow error\n"); 50 | return -ENOSPC; 51 | } 52 | if (copy_from_user(&cookie_buffer[next_index], buf, len)) { 53 | printk(KERN_ERR "+: copy_to_user error\n"); 54 | return -EFAULT; 55 | } 56 | next_index += len; 57 | cookie_buffer[next_index - 1] = '\0'; 58 | return len; 59 | } 60 | 61 | int fortune_open(struct inode *inode, struct file *file) { 62 | printk(KERN_INFO "+: called open\n"); 63 | return 0; 64 | } 65 | 66 | int fortune_release(struct inode *inode, struct file *file) { 67 | printk(KERN_INFO "+: called release\n"); 68 | return 0; 69 | } 70 | 71 | static const struct proc_ops fops = { 72 | proc_read: fortune_read, 73 | proc_write: fortune_write, 74 | proc_open: fortune_open, 75 | proc_release: fortune_release 76 | }; 77 | 78 | static void freemem(void) { 79 | if (fortune_link) 80 | remove_proc_entry(SYMLINK, NULL); 81 | if (fortune_file) 82 | remove_proc_entry(FILENAME, fortune_dir); 83 | if (fortune_dir) 84 | remove_proc_entry(DIRNAME, NULL); 85 | if (cookie_buffer) 86 | vfree(cookie_buffer); 87 | } 88 | 89 | static int __init fortune_init(void) { 90 | if (!(cookie_buffer = vmalloc(MAX_BUF_SIZE))) { 91 | freemem(); 92 | printk(KERN_ERR "+: error during vmalloc\n"); 93 | return -ENOMEM; 94 | } 95 | memset(cookie_buffer, 0, MAX_BUF_SIZE); 96 | 97 | if (!(fortune_dir = proc_mkdir(DIRNAME, NULL))) { 98 | freemem(); 99 | printk(KERN_ERR "+: error during directory creation\n"); 100 | return -ENOMEM; 101 | } else if (!(fortune_file = proc_create(FILENAME, 0666, fortune_dir, &fops))) { 102 | freemem(); 103 | printk(KERN_ERR "+: error during file creation\n"); 104 | return -ENOMEM; 105 | } else if (!(fortune_link = proc_symlink(SYMLINK, NULL, FILEPATH))) { 106 | freemem(); 107 | printk(KERN_ERR "+: error during symlink creation\n"); 108 | return -ENOMEM; 109 | } 110 | 111 | next_index = 0; 112 | current_fortune = 0; 113 | 114 | printk(KERN_INFO "+: module loaded\n"); 115 | return 0; 116 | } 117 | 118 | static void __exit fortune_exit(void) { 119 | freemem(); 120 | printk(KERN_INFO "+: module unloaded\n"); 121 | } 122 | 123 | module_init(fortune_init) 124 | module_exit(fortune_exit) 125 | -------------------------------------------------------------------------------- /sem5/lab1/lab_01_1/report/preamble.inc.tex: -------------------------------------------------------------------------------- 1 | \usepackage{cmap} 2 | \usepackage[T2A]{fontenc} 3 | \usepackage[utf8]{inputenc} 4 | \usepackage[english,russian]{babel} 5 | \usepackage{verbatim} 6 | \usepackage{amssymb} 7 | \usepackage{amsmath} 8 | \usepackage{amsthm} 9 | \usepackage{textcomp} 10 | \usepackage{makeidx} 11 | \usepackage{geometry} 12 | \usepackage{float} 13 | \usepackage{bm} 14 | \usepackage{esint} 15 | 16 | % геометрия 17 | \geometry{pdftex, left = 2cm, right = 2cm, top = 2.5cm, bottom = 2.5cm} 18 | 19 | \usepackage{titlesec} 20 | \titleformat{\section} 21 | {\normalsize\bfseries} 22 | {\thesection} 23 | {1em}{} 24 | \titlespacing*{\chapter}{0pt}{-30pt}{8pt} 25 | \titlespacing*{\section}{\parindent}{*4}{*4} 26 | \titlespacing*{\subsection}{\parindent}{*4}{*4} 27 | 28 | \usepackage{setspace} 29 | \onehalfspacing % Полуторный интервал 30 | 31 | \frenchspacing 32 | \usepackage{indentfirst} % Красная строка 33 | 34 | \usepackage{titlesec} 35 | \titleformat{\chapter}{\LARGE\bfseries}{\thechapter}{20pt}{\LARGE\bfseries} 36 | \titleformat{\section}{\Large\bfseries}{\thesection}{20pt}{\Large\bfseries} 37 | 38 | \usepackage{graphicx} 39 | \graphicspath{{inc/img/}} 40 | \DeclareGraphicsExtensions{.png,.jpg} 41 | 42 | \usepackage[justification=centering]{caption} % Настройка подписей float объектов 43 | 44 | \usepackage{listings} 45 | \usepackage{xcolor} 46 | \lstdefinestyle{asm}{ 47 | language={[x86masm]Assembler}, 48 | backgroundcolor=\color{white}, 49 | basicstyle=\footnotesize\ttfamily, 50 | keywordstyle=\color{blue}, 51 | stringstyle=\color{red}, 52 | commentstyle=\color{gray}, 53 | numbers=left, 54 | numberstyle=\tiny, 55 | stepnumber=1, 56 | numbersep=5pt, 57 | frame=single, 58 | tabsize=4, 59 | captionpos=b, 60 | breaklines=true 61 | } 62 | 63 | \lstset{ 64 | literate= 65 | {а}{{\selectfont\char224}}1 66 | {б}{{\selectfont\char225}}1 67 | {в}{{\selectfont\char226}}1 68 | {г}{{\selectfont\char227}}1 69 | {д}{{\selectfont\char228}}1 70 | {е}{{\selectfont\char229}}1 71 | {ё}{{\"e}}1 72 | {ж}{{\selectfont\char230}}1 73 | {з}{{\selectfont\char231}}1 74 | {и}{{\selectfont\char232}}1 75 | {й}{{\selectfont\char233}}1 76 | {к}{{\selectfont\char234}}1 77 | {л}{{\selectfont\char235}}1 78 | {м}{{\selectfont\char236}}1 79 | {н}{{\selectfont\char237}}1 80 | {о}{{\selectfont\char238}}1 81 | {п}{{\selectfont\char239}}1 82 | {р}{{\selectfont\char240}}1 83 | {с}{{\selectfont\char241}}1 84 | {т}{{\selectfont\char242}}1 85 | {у}{{\selectfont\char243}}1 86 | {ф}{{\selectfont\char244}}1 87 | {х}{{\selectfont\char245}}1 88 | {ц}{{\selectfont\char246}}1 89 | {ч}{{\selectfont\char247}}1 90 | {ш}{{\selectfont\char248}}1 91 | {щ}{{\selectfont\char249}}1 92 | {ъ}{{\selectfont\char250}}1 93 | {ы}{{\selectfont\char251}}1 94 | {ь}{{\selectfont\char252}}1 95 | {э}{{\selectfont\char253}}1 96 | {ю}{{\selectfont\char254}}1 97 | {я}{{\selectfont\char255}}1 98 | {А}{{\selectfont\char192}}1 99 | {Б}{{\selectfont\char193}}1 100 | {В}{{\selectfont\char194}}1 101 | {Г}{{\selectfont\char195}}1 102 | {Д}{{\selectfont\char196}}1 103 | {Е}{{\selectfont\char197}}1 104 | {Ё}{{\"E}}1 105 | {Ж}{{\selectfont\char198}}1 106 | {З}{{\selectfont\char199}}1 107 | {И}{{\selectfont\char200}}1 108 | {Й}{{\selectfont\char201}}1 109 | {К}{{\selectfont\char202}}1 110 | {Л}{{\selectfont\char203}}1 111 | {М}{{\selectfont\char204}}1 112 | {Н}{{\selectfont\char205}}1 113 | {О}{{\selectfont\char206}}1 114 | {П}{{\selectfont\char207}}1 115 | {Р}{{\selectfont\char208}}1 116 | {С}{{\selectfont\char209}}1 117 | {Т}{{\selectfont\char210}}1 118 | {У}{{\selectfont\char211}}1 119 | {Ф}{{\selectfont\char212}}1 120 | {Х}{{\selectfont\char213}}1 121 | {Ц}{{\selectfont\char214}}1 122 | {Ч}{{\selectfont\char215}}1 123 | {Ш}{{\selectfont\char216}}1 124 | {Щ}{{\selectfont\char217}}1 125 | {Ъ}{{\selectfont\char218}}1 126 | {Ы}{{\selectfont\char219}}1 127 | {Ь}{{\selectfont\char220}}1 128 | {Э}{{\selectfont\char221}}1 129 | {Ю}{{\selectfont\char222}}1 130 | {Я}{{\selectfont\char223}}1 131 | } 132 | -------------------------------------------------------------------------------- /sem5/lab1/lab_01_1/int8h.drawio: -------------------------------------------------------------------------------- 1 | 7V1bc5u6Fv41njnnwR0k7o92bGf3NN3tTHZP0/3SITa1aYnxtnHjnF9/uAmEJO4XQeJOxwEhQCxpfesqaSLePF1uj8Zh99HZmPYECpvLRFxMIAQShBP/v7B5CUtUWQgLtkdrE1VKCu6t/5lRIap2tjbmKVXRdRzbtQ7pwrWz35trN1VmHI/Oc7raD8dOv/VgbE2q4H5t2HTpV2vj7sJSDapJ+R+mtd2hNwNFD688Gahy9CWnnbFxnrEicTkRb46O44ZHT5cb0/aJh+gS3rfKuBo37Gju3TI3TL8r9lf37/v/zq2Pd+sPt9bfp/MUSFHj3Bf0xebGI0B06hzdnbN19oa9TErnR+e835j+YwXvLKlz5zgHrxB4hT9N132JetM4u45XtHOf7OiqebHcB//2d3J09g27srhETw5OXtDJ3j2+YDf5p9/wa8ltwVly32bmjwPvdO/szbBkZdl2dJ0mY0TZk3M+rs082kXD0ThuTTennhjW8+mKvSDqpFvTeTK99noVjqZtuNbv9MAzovG7jeslXewdRL1cpcfD5/427HP0pglUbK/984312zvc+ocTjzT6wv+dCxOvYzQVHXu/wdX5Et3mtQK/kxxOyWDx+/d5Z7nm/cEICPvsQUZ6YBjHdTRo5Ny++W0eXfOSS83oKpQi9ovwB50+J8wMlKhshzEygqkm9H94eHSev3xd/XlxvonPt/Kv3XQ/vTIcixvqcSCkOZBJc64MB2mG8+gwAxEX+dwlB78CxmMh78nYsRaVQAGrHFYQUQWvHAS/EKuzDH79JizvJ9D7BmER/Z09ROcPOVwrFHNtB2wKFLE/PmXjpHxl1Lp8KZaUjHBQklFkMqoe8lIo9FSCo4KDVZrZvGMFY04pKBFRneBRHgnPj98BNcA8FfHgHx6Ozto8nYo579FY/9oGg+7T2bUtvxOD8lM4voR3giKKOtRk1dPE/d+u2FXoUayy2VW9smtGtxayodw2G0a3fnYsrynxoBEhoYqpMP2IEFeiu4jxEDej/hCRMjXfH07QzmTsKP+cHXRhGjLTzKsAhMMluZhSljVMVM8oCX2TFueBhI7Q4wbTqQUMMTTsFh1J/VgNxyV9IPshXqj6vzquCqiYDjGLHsLQJGIF3yu/wb5oiekZS9RyWPSZccNCkMTvxb80fkLcfg+JBUHwMEacCYJyg7rp8ZhYGbHtEfZdofHBR42RIHc1RuOKixgqJhiZhYsxvq1t43Sy1imIy+2hQo1ELgmFyqA0EjkTsQ5MuPI1gCkaVj5g6d6wkhmIVRH3dB/2QhkjUO/QMt7ho2I+uIX4s8oFtwCIaP6vg3We0SVEGp3/MQsfZCbiqgK6xMWHbMTZOU+P5xKqWxdoo0HOaBP7OkeghXWINkpJtAGtG0DlNC9FIDSvsKWU5uVRyHjBqh38Cqfs90CB/Z5VxXYlQzBsQatqoFKoBqIgBII00KrOR6husRI2PJ2vZz1vOVStDhDDVJa44+zV2q0NznpZcBYGpQvqrcFWaMwBDJhETE3L8TmPBLY4mqrDgzAUdhe5QxZfQ3TUkIWgqBizwKAwC7WbG2hd/WtV/GuDAy2dN2iJfKL1zQEoy6atg4cNcKt1OKpllmpp9V2H+VYpacVWri9Ws3qJ+mmrt/huuZwt35b5jPq0OabPRJZWSWAiZEGqRGG6mPLzMUKyONzjAkCLEjBS+C5iTVpGDWiMs6owVJzVZN44C/kkW/SAsxjKFgVAGuAsLKsftp6L2I6fUFKzEbAt4EIWUN9jLN8oqDsGmw+Wvp3OZQVV1cEkSbmDqbB+q+K6NSkLM6XsOEJ/s3xnEf/QH5ReVexPgdxluHKV4U1guWzSpN42fDezkDlpbgVSNeo60GvXdS1RswzTtiUqFZbV8yUqJSHTBnNHEpKRrjsqCTn45BigKqMWkWTYVkH5pvxEJCsFlURPCtoY4YwquJYG2/ooVzZLGKOunEPchlhIavGyTmBhRjIxt9wYqsFCNTOll9wYyIgy+6DASOuybetwMosZ2Tgdwnm5P6yLPwrn6QmBbajCupwWP2iIlRyJ7etEjBQjn4oSwluClt53ummiHU1PvhiPQQWfa6PB5dWW5xN54ZPV04kiR2tAZdva7r1j2/zhP8onnrU27FlU7Pp61fzkdZK13/4VKFlTqSXqk1n9mkpRX2RQH3ZGffUNU59lBvZLfe0NUR+QfkyGhtEr9aXr7OLa+o1YNjFMGlaShThGma2qaZnNmJbfq8iWrrN9azMO4odixhnWShio3dw9COG0wiwXAgA5PgQJC2vXSEGv4h+olo8kpePkSywaMMOSoJbYS4kkrtj7Eb8If8gSCynktFnCngawCnhywRKriWcQ1IzzS0LLLpOes91VQqXkP7dbGtEcxs6iEQ3wuWxkQRrY7EeuymwVF1uHsrWn0IJGWDKiRDBzS14wnQQXTcYfV1gftatTL5g0lNACAM2i70XiPRJualrExcItLFEwsRmId7/BI585S8k4hbeMk+nVYMYRPW8b8MrOnUU9MRBhJbU2rbTDtNgRaeFjWfFDIQRn7NvjhyTiSJGkg1U/ys6bQqmJnPNiFS1X2ymttXWqHSGidrOOEo4ueBa/kAF7BJbcUHgZ2uzz5hD46WaXeEIIL0GCgrAB5gniCu5GA3Qad6DTuQDda3ELIMwrBkdtUJqWMlZNuSjPtJ9kxY5EXaHlLokEDnQ8Tw19Z2MjPjK/WVl/raQONrQB0hOgoYAVahm5gSw7IUkzxD0G+BsZU6I/s1wASEAih7gIpFflKxD5+woY68ItXmuOhUroHayVoXvNsZAz8ouu6wQXK42xEODGO8prm9HfQBPQSiqAyjBmjZLWsaRXs46J+h1Zxxn5b5XQQU6hQCLrcR0gMUyBb5heEaI1hBj0jKZWFu7oO5ooC+V0/6bRxFYRofhtGvFVHa9frjAsmjej9omILXmpfQqfJRcHF6BTymaTKMPKJlGu23vUNnllwFsoo8T6N899ZcPj6rDC4wp7SlS0CxagWAxMGMEdlMKaqhx7suZp1ZlI5qyqWwtoVUAiP2aVDuuE6/gF8SMoeLwwKRchCmqSPi3OeZ6yyp3Jx2qbt8zkqCOKmXxYCfWo3QwRS7iQqzu2E7ZstAXe4oHY+i7aCs/fGm9g/Khwt4TVDJWJwOQYVOkFYDhv/kmRVIfvaDOiM6L++PDy+ftH5W73n83td9H8IF9+3k7HukpOfYxjkoExZ4hZD/JCuLxWv5XNcwG54kyfu+dOFw+/DOdp6/z8fPlyvjv+c2Ofpnxy28Y2TS+Pk1JKBYvEw+I4ts+Lx+65+K65nFUFii97naPF7Kfr/NnajMlwqDHrSYNizAzdEJd1uFdMxCxpIn+zzAr9xNL4AKusp2yJygzu37Jc3c1u73HbffbH8JgcohUWuTE5cgNeMy5rMbpUktG5rfDI7nQ+rtda0zBH3On8tm7Ja/bbyp5MzRTIzKFcxBOitHRFet8YeuFjwrUMMNnk0/v9p893mBwiX/1acipp2aZxl21vaemk9mGOsXgSm8zDyCUD8eCKPRsKPoToG8hdZIgbGmeT5VE1T8mmY1swrVjHqCQks7hJvTxeziUMigG0I0rz2JmGQSuhfMdvn2FRdXJbrrVt8dfEBWpeHne0GpG93ZkLuadsNgBV/Z2O/dPSQACU9BNbSm4DEuV8HSJEldgPqtwyF1nrWOTkBxTOeSf8giqFZTjcMOe810/LfR8/wycPrrkNdIYnIJdCHgDMXfc5rg+PZf2KgFuiXm67m3kWfQcekYqT72dkGmZpD2ND3yJ3/qaiefwdinyncI+bvxmpgOyK3OZv57Z7wFlCeHbQ4JiWv6eEMcUpIwsiJ1NolPkPsqS8E1CytcTfaYWkypuYEgKARjoNdYr+nc0JYaVK8MnlGpv0YpKu9JrRvGRXXqsr5n9liRqdiobXlFe5gYAUvlKNxRNgK0JyPwKQ3Oiw3+UXWIPgLQUKWuZ6WFJl5ZfXntNqeoOFxIYk1gSPWV/BODjeyw1QLM5aqJ3Ud/EUmMpW6CLObllgcBM/G6RNY0DtMYevaYY/B8VMUchg/v6T/6Z/ScLu39yhg06TY6wd0hl2PDw8Os9fvq7+vDjfxOdb+dduur+myTEZuxBMmLRkqBDMerAn7Mhr5BU7+scOCigYw6y02gH7nI3DHElXV3h70MHQQ7L1fV7Q8QrUjiUDOt4v/vK5HHupSHny8OVRY5d85ocPEC30Hj1DzMFTNHUvHg+QcqDGuIwT/xWvX9So5zWi57tcv8g7PTp+jDy+duvRYffR2Zh+jf8D -------------------------------------------------------------------------------- /sem5/lab6/src/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | #define READERS_COUNT 5 8 | #define WRITERS_COUNT 3 9 | #define ITERATIONS 10 10 | #define MAX_RANDOM 3 11 | 12 | HANDLE writers[WRITERS_COUNT]; 13 | HANDLE readers[READERS_COUNT]; 14 | 15 | HANDLE mutex; 16 | HANDLE can_read; 17 | HANDLE can_write; 18 | __volatile__ LONG waiting_writers = 0; 19 | __volatile__ LONG waiting_readers = 0; 20 | __volatile__ LONG active_readers = 0; 21 | bool is_writer_active = false; 22 | 23 | static __volatile__ int value = 0; 24 | 25 | void read_start(void) { 26 | InterlockedIncrement(&waiting_readers); 27 | if (is_writer_active || 28 | WaitForSingleObject(can_write, 0) == WAIT_OBJECT_0) { 29 | WaitForSingleObject(can_read, INFINITE); 30 | } 31 | 32 | WaitForSingleObject(mutex, INFINITE); 33 | 34 | InterlockedDecrement(&waiting_readers); 35 | InterlockedIncrement(&active_readers); 36 | 37 | SetEvent(can_read); 38 | ReleaseMutex(mutex); 39 | } 40 | 41 | static inline void read_stop(void) { 42 | InterlockedDecrement(&active_readers); 43 | if (waiting_readers == 0) { 44 | SetEvent(can_write); 45 | } 46 | } 47 | 48 | DWORD WINAPI reader(LPVOID lpParams) { 49 | while (value < WRITERS_COUNT * ITERATIONS) { 50 | int sleep_time = rand() % MAX_RANDOM + 1; 51 | sleep(sleep_time); 52 | 53 | // !!! --- CRITICAL --- !!! 54 | read_start(); 55 | printf(" Reader #%d read: %3d -- idle %ds\n", 56 | (int)lpParams, 57 | value, 58 | sleep_time); 59 | read_stop(); 60 | // !!! --- CRITICAL --- !!! 61 | } 62 | 63 | return EXIT_SUCCESS; 64 | } 65 | 66 | void write_start(void) { 67 | InterlockedIncrement(&waiting_writers); 68 | if (is_writer_active || active_readers > 0) { 69 | WaitForSingleObject(can_write, INFINITE); 70 | } 71 | 72 | InterlockedDecrement(&waiting_writers); 73 | is_writer_active = true; 74 | ResetEvent(can_write); 75 | } 76 | 77 | static inline void write_stop(void) { 78 | is_writer_active = false; 79 | 80 | if (!waiting_writers) { 81 | SetEvent(can_read); 82 | } else { 83 | SetEvent(can_write); 84 | } 85 | } 86 | 87 | DWORD WINAPI writer(LPVOID lpParams) { 88 | for (short i = 0; i < ITERATIONS; ++i) { 89 | int sleep_time = rand() % MAX_RANDOM + 1; 90 | sleep(sleep_time); 91 | 92 | // !!! --- CRITICAL --- !!! 93 | write_start(); 94 | ++value; 95 | printf(" Writer #%d write: %3d -- idle %ds\n", 96 | (int)lpParams, 97 | value, 98 | sleep_time); 99 | write_stop(); 100 | // !!! --- CRITICAL --- !!! 101 | } 102 | 103 | return EXIT_SUCCESS; 104 | } 105 | 106 | int init(void) { 107 | if ((mutex = CreateMutex(NULL, FALSE, NULL)) == NULL) { 108 | perror("create mutex error!"); 109 | return EXIT_FAILURE; 110 | } 111 | 112 | if ((can_read = CreateEvent(NULL, FALSE, TRUE, NULL)) == NULL) { 113 | perror("create event `can_read` error!"); 114 | return EXIT_FAILURE; 115 | } 116 | if ((can_write = CreateEvent(NULL, TRUE, TRUE, NULL)) == NULL) { 117 | perror("create event `can_write` error!"); 118 | return EXIT_FAILURE; 119 | } 120 | 121 | return EXIT_SUCCESS; 122 | } 123 | 124 | int create_threads(HANDLE *threads, 125 | int threads_count, 126 | DWORD (*on_thread)(LPVOID)) { 127 | for (short i = 0; i < threads_count; ++i) { 128 | if ((threads[i] = CreateThread(NULL, 0, on_thread, (LPVOID)i, 0, 129 | NULL)) == NULL) { 130 | perror("create thread error!"); 131 | return EXIT_FAILURE; 132 | } 133 | } 134 | 135 | return EXIT_SUCCESS; 136 | } 137 | 138 | int main(void) { 139 | setbuf(stdout, NULL); 140 | 141 | if (init() != EXIT_SUCCESS || 142 | create_threads(writers, WRITERS_COUNT, writer) != EXIT_SUCCESS || 143 | create_threads(readers, READERS_COUNT, reader) != EXIT_SUCCESS) { 144 | return EXIT_FAILURE; 145 | } 146 | 147 | WaitForMultipleObjects(WRITERS_COUNT, writers, TRUE, INFINITE); 148 | WaitForMultipleObjects(READERS_COUNT, readers, TRUE, INFINITE); 149 | 150 | CloseHandle(mutex); 151 | CloseHandle(can_read); 152 | CloseHandle(can_write); 153 | 154 | return EXIT_SUCCESS; 155 | } 156 | -------------------------------------------------------------------------------- /sem6/lab7/vfs.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | #define MYFS_MAGIC 0xBADCAFE 9 | #define MAX_CACHE_SIZE 128 10 | #define SLAB_NAME "myfs_slab" 11 | #define OK 0 12 | 13 | static struct kmem_cache *cache = NULL; 14 | static void **cache_area = NULL; 15 | 16 | MODULE_LICENSE("GPL"); 17 | MODULE_AUTHOR("Bogachenko Artem"); 18 | 19 | struct myfs_inode { 20 | int i_mode; 21 | unsigned long i_ino; 22 | }; 23 | 24 | static struct inode *myfs_make_inode(struct super_block *sb, int mode) { 25 | struct inode *ret = new_inode(sb); 26 | 27 | printk(KERN_DEBUG "+ MYFS: myfs_make_inode\n"); 28 | 29 | 30 | if (ret) { 31 | inode_init_owner(&init_user_ns, ret, NULL, mode); 32 | printk(KERN_DEBUG "+ MYFS: inode_init_owner\n"); 33 | 34 | ret->i_size = PAGE_SIZE; 35 | ret->i_atime = ret->i_mtime = ret->i_ctime = current_time(ret); 36 | // ret->i_no = 1; 37 | } 38 | return ret; 39 | } 40 | 41 | static void myfs_put_super(struct super_block *sb) { 42 | printk(KERN_DEBUG "+ MYFS: kill_sb\n"); 43 | } 44 | 45 | static struct super_operations const myfs_super_ops = { 46 | .put_super = myfs_put_super, 47 | .statfs = simple_statfs, 48 | .drop_inode = generic_delete_inode, 49 | }; 50 | 51 | static int myfs_fill_sb(struct super_block *sb, void *data, int silent) { 52 | printk(KERN_DEBUG "+ MYFS: myfs_fill_sb\n"); 53 | 54 | 55 | sb->s_blocksize = PAGE_SIZE; 56 | sb->s_blocksize_bits = PAGE_SHIFT; 57 | sb->s_magic = MYFS_MAGIC; 58 | sb->s_op = &myfs_super_ops; 59 | 60 | struct inode *root = myfs_make_inode(sb, S_IFDIR | 0755); 61 | 62 | if (!root) { 63 | printk(KERN_ERR "+ MYFS: inode allocation failed...\n"); 64 | return -ENOMEM; 65 | } 66 | 67 | root->i_op = &simple_dir_inode_operations; 68 | root->i_fop = &simple_dir_operations; 69 | root->i_ino = 1; 70 | 71 | printk(KERN_DEBUG "+ MYFS: d_make_root\n"); 72 | 73 | if (!(sb->s_root = d_make_root(root))) { 74 | printk(KERN_ERR "+ MYFS: root creation failed\n"); 75 | iput(root); 76 | 77 | return -ENOMEM; 78 | } 79 | 80 | return OK; 81 | } 82 | 83 | static struct dentry *myfs_mount(struct file_system_type *type, int flags, 84 | char const *dev, void *data) { 85 | struct dentry *const entry = mount_nodev(type, flags, data, myfs_fill_sb); 86 | printk(KERN_DEBUG "+ MYFS: myfs_mount\n"); 87 | printk(KERN_DEBUG "+ MYFS: mount_nodev\n"); 88 | 89 | 90 | if (IS_ERR(entry)) 91 | printk(KERN_ERR "+ MYFS: mounting failed\n"); 92 | else 93 | printk(KERN_DEBUG "+ MYFS: mounted!\n"); 94 | 95 | return entry; 96 | } 97 | 98 | static struct file_system_type myfs_type = { 99 | .owner = THIS_MODULE, 100 | .name = "myfs", 101 | .mount = myfs_mount, 102 | .kill_sb = kill_anon_super, 103 | .fs_flags = FS_USERNS_MOUNT, 104 | }; 105 | 106 | static int __init myfs_init(void) { 107 | int ret = register_filesystem(&myfs_type); 108 | printk(KERN_DEBUG "+ MYFS: register_filesystem\n"); 109 | 110 | if (ret != 0) { 111 | printk(KERN_ERR "+ MYFS: Failed to register filesystem\n"); 112 | return ret; 113 | } 114 | 115 | printk(KERN_DEBUG "+ MYFS: kmem_cache_create\n"); 116 | 117 | if ((cache = kmem_cache_create(SLAB_NAME, sizeof(void *), 0, 0, NULL)) == 118 | NULL) { 119 | printk(KERN_ERR "+ MYFS: Failed to create cache\n"); 120 | 121 | return -ENOMEM; 122 | } 123 | 124 | printk(KERN_DEBUG "+ MYFS: kmem_cache_alloc\n"); 125 | 126 | // if ((cache_area = kmem_cache_alloc(cache, 0)) == NULL) { 127 | // printk(KERN_ERR "+ MYFS: Failed to allocate cache\n"); 128 | // kmem_cache_destroy(cache); 129 | // return -ENOMEM; 130 | // } 131 | 132 | printk(KERN_DEBUG "+ MYFS: Module loaded\n"); 133 | return OK; 134 | } 135 | 136 | static void __exit myfs_exit(void) { 137 | int ret = unregister_filesystem(&myfs_type); 138 | printk(KERN_DEBUG "+ MYFS: unregister_filesystem\n"); 139 | 140 | if (ret != 0) { 141 | printk(KERN_ERR "+ MYFS: Can't unregister filesystem\n"); 142 | return; 143 | } 144 | printk(KERN_DEBUG "+ MYFS: kmem_cache_free\n"); 145 | 146 | // kmem_cache_free(cache_area, cache); 147 | 148 | printk(KERN_DEBUG "+ MYFS: kmem_cache_destroy\n"); 149 | 150 | kmem_cache_destroy(cache); 151 | printk(KERN_DEBUG "+ MYFS: Module unloaded\n"); 152 | } 153 | 154 | module_init(myfs_init); 155 | module_exit(myfs_exit); 156 | 157 | // touch file 158 | // mkdir dir 159 | // sudo mount -o loop -t myfs ./file ./dir 160 | -------------------------------------------------------------------------------- /sem6/lab9/workqueue/workq.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | 13 | MODULE_LICENSE("GPL"); 14 | MODULE_AUTHOR("Bogachenko Artem"); 15 | 16 | #define IRQ 1 17 | #define KBD_DATA_REG 0x60 18 | #define KBD_SCANCODE_MASK 0x7f 19 | #define KBD_STATUS_MASK 0x80 20 | static int devID; 21 | static char *ascii_map[] = { 22 | "[ESC]", "1", "2", "3", "4", 23 | "5", "6", "7", "8", "9", 24 | "0", "-", "=", "bs", "[Tab]", 25 | "Q", "W", "E", "R", "T", 26 | "Y", "U", "I", "O", "P", 27 | "[", "]", "[Enter]", "[CTRL]", "A", 28 | "S", "D", "F", "G", "H", 29 | "J", "K", "L", ";", "\'", 30 | "`", "[LShift]", "\\", "Z", "X", 31 | "C", "V", "B", "N", "M", 32 | ",", ".", "/", "[RShift]", "[PrtSc]", 33 | "[Alt]", " ", "[Caps]", "F1", "F2", 34 | "F3", "F4", "F5", "F6", "F7", 35 | "F8", "F9", "F10", "[Num]", "[Scroll]", 36 | "[Home(7)]", "[Up(8)]", "[PgUp(9)]", "-", "[Left(4)]", 37 | "[Center(5)]", "[Right(6)]", "+", "[End(1)]", "[Down(2)]", 38 | "[PgDn(3)]", "[Ins]", "[Del]"}; 39 | 40 | char *key; 41 | char scancode; 42 | int status; 43 | 44 | struct workqueue_struct *workQueue; 45 | 46 | void queueFunctionF(struct work_struct *work) { 47 | scancode = inb(KBD_DATA_REG); 48 | status = scancode & KBD_STATUS_MASK; 49 | if (!(status)) { 50 | key = ascii_map[(scancode & KBD_SCANCODE_MASK) - 1]; 51 | } 52 | printk(KERN_INFO "+ Key was clicked (1 worker) and we sleep\n"); 53 | msleep(10); 54 | } 55 | 56 | void queueFunctionS(struct work_struct *work) { 57 | scancode = inb(KBD_DATA_REG); 58 | status = scancode & KBD_STATUS_MASK; 59 | if (!(status)) { 60 | key = ascii_map[(scancode & KBD_SCANCODE_MASK) - 1]; 61 | } 62 | printk(KERN_INFO "+ Key was clicked (2 worker). Key: %s\n", key); 63 | } 64 | 65 | struct work_struct fWork; 66 | struct work_struct sWork; 67 | 68 | irqreturn_t handler(int irq, void *dev) { 69 | printk(KERN_INFO "+ move work to queue...\n"); 70 | if (irq == IRQ) { 71 | queue_work(workQueue, &fWork); 72 | queue_work(workQueue, &sWork); 73 | return IRQ_HANDLED; 74 | } 75 | return IRQ_NONE; 76 | } 77 | 78 | static struct proc_dir_entry *file = NULL; 79 | 80 | int procShow(struct seq_file *filep, void *v) { 81 | printk(KERN_INFO "+ called show\n"); 82 | seq_printf(filep, "Data of a 1 work: %d", fWork.data); 83 | seq_printf(filep, "Data of a 2 work: %d", sWork.data); 84 | return 0; 85 | } 86 | 87 | int procOpen(struct inode *inode, struct file *fileInner) { 88 | printk(KERN_INFO "+ called open\n"); 89 | return single_open(fileInner, procShow, NULL); 90 | } 91 | 92 | int procRelease(struct inode *inode, struct file *fileInner) { 93 | printk(KERN_INFO "+ called release\n"); 94 | return single_release(inode, fileInner); 95 | } 96 | 97 | static struct proc_ops fops = { 98 | proc_read : seq_read, 99 | proc_open : procOpen, 100 | proc_release : procRelease 101 | }; 102 | 103 | static int __init workQueueInit(void) { 104 | int ret = request_irq(IRQ, handler, IRQF_SHARED, "handler", &devID); 105 | if (ret) { 106 | printk(KERN_ERR "+ handler wasn't registered\n"); 107 | return ret; 108 | } 109 | 110 | if (!(workQueue = create_workqueue("workQueue"))) { 111 | free_irq(IRQ, &devID); 112 | printk(KERN_INFO "+ workqueue wasn't created"); 113 | return -ENOMEM; 114 | } 115 | 116 | INIT_WORK(&fWork, queueFunctionF); 117 | INIT_WORK(&sWork, queueFunctionS); 118 | 119 | if (!proc_create("workqueue", 0666, file, &fops)) { 120 | printk(KERN_INFO "+ cannot proc_create!\n"); 121 | return -1; 122 | } 123 | 124 | printk(KERN_INFO "+ module loaded\n"); 125 | return 0; 126 | } 127 | 128 | static void __exit workQueueExit(void) { 129 | flush_workqueue(workQueue); 130 | destroy_workqueue(workQueue); 131 | free_irq(IRQ, &devID); 132 | remove_proc_entry("workqueue", NULL); 133 | printk(KERN_INFO "+ module unloaded\n"); 134 | } 135 | 136 | module_init(workQueueInit); 137 | module_exit(workQueueExit); 138 | -------------------------------------------------------------------------------- /sem6/lab4/part2/seqfile.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | MODULE_LICENSE("GPL"); 10 | MODULE_AUTHOR("Bogachenko Artem"); 11 | 12 | #define DIRNAME "seqfiles" 13 | #define FILENAME "seqfile" 14 | #define SYMLINK "seqfile_link" 15 | #define FILEPATH DIRNAME "/" FILENAME 16 | 17 | #define MAX_COOKIE_LENGTH PAGE_SIZE 18 | 19 | static char tmp[256]; 20 | 21 | static struct proc_dir_entry *proc_file = NULL; 22 | static struct proc_dir_entry *proc_dir = NULL; 23 | static struct proc_dir_entry *proc_link = NULL; 24 | 25 | static char *cookie_pot = NULL; 26 | static int cookie_index = 0; 27 | static int next_seq_file = 0; 28 | 29 | ssize_t seq_file_write(struct file *filep, const char __user *buf, size_t len, loff_t *offp); 30 | 31 | static int seq_file_show(struct seq_file *m, void *v) { 32 | 33 | printk(KERN_INFO "+: seq_file: show\n"); 34 | if (!cookie_index) 35 | return 0; 36 | 37 | if (next_seq_file >= cookie_index) { 38 | next_seq_file = 0; 39 | } 40 | 41 | int len = snprintf(tmp, MAX_COOKIE_LENGTH, "%s\n", &cookie_pot[next_seq_file]); 42 | seq_printf(m, "%s", tmp); 43 | next_seq_file += len; 44 | return 0; 45 | } 46 | 47 | static void *seq_file_start(struct seq_file *m, loff_t *pos) 48 | { 49 | 50 | printk(KERN_INFO "+: seq_file: start\n"); 51 | static unsigned long counter =0; 52 | if (!*pos) { 53 | return &counter; 54 | } 55 | else { 56 | *pos = 0; 57 | return NULL; 58 | } 59 | } 60 | 61 | static void *seq_file_next(struct seq_file *m, void *v, loff_t *pos) { 62 | printk(KERN_INFO "+: seq_file: next\n"); 63 | unsigned long *tmp = (unsigned long *) v; 64 | (*tmp)++; 65 | (*pos)++; 66 | return NULL; 67 | } 68 | 69 | static void seq_file_stop(struct seq_file *m, void *v) { 70 | printk(KERN_INFO "+: seq_file: stop\n"); 71 | } 72 | 73 | static struct seq_operations seq_file_ops = { 74 | .start = seq_file_start, 75 | .next = seq_file_next, 76 | .stop = seq_file_stop, 77 | .show = seq_file_show 78 | }; 79 | 80 | static int seq_file_open(struct inode *i, struct file * f) { 81 | printk(KERN_DEBUG "+: seq_file: open seq_file\n"); 82 | return seq_open(f, &seq_file_ops); 83 | } 84 | 85 | static struct proc_ops ops = { 86 | .proc_open = seq_file_open, 87 | .proc_read = seq_read, 88 | .proc_write = seq_file_write, 89 | .proc_lseek = seq_lseek, 90 | .proc_release = seq_release, 91 | }; 92 | 93 | void cleanup_seq_file_module(void); 94 | 95 | static int __init init_seq_file_module(void) { 96 | 97 | cookie_pot = (char *)vmalloc(MAX_COOKIE_LENGTH); 98 | if(!cookie_pot) { 99 | printk(KERN_ERR "+: seq_file: vmalloc error\n"); 100 | return -ENOMEM; 101 | } 102 | memset(cookie_pot, 0, MAX_COOKIE_LENGTH); 103 | 104 | proc_dir = proc_mkdir(DIRNAME, NULL); 105 | if (!proc_dir) { 106 | printk(KERN_INFO "+: seq_file: Couldn't create proc dir.\n"); 107 | 108 | cleanup_seq_file_module(); 109 | return -ENOMEM; 110 | } 111 | 112 | proc_file = proc_create(FILENAME, 0666, proc_dir, &ops); 113 | if (!proc_file) { 114 | printk(KERN_INFO "+: seq_file: Couldn't create proc file.\n"); 115 | cleanup_seq_file_module(); 116 | return -ENOMEM; 117 | } 118 | proc_link = proc_symlink(SYMLINK, NULL, FILEPATH); 119 | if (!proc_link) 120 | { 121 | printk(KERN_INFO "+: seq_file: Couldn't create proc symlink.\n"); 122 | cleanup_seq_file_module(); 123 | return -ENOMEM; 124 | } 125 | 126 | cookie_index = 0; 127 | next_seq_file = 0; 128 | printk(KERN_INFO "+: seq_file: Module loaded.\n"); 129 | 130 | return 0; 131 | } 132 | 133 | void cleanup_seq_file_module(void) { 134 | if (cookie_pot) 135 | vfree(cookie_pot); 136 | if (proc_link) 137 | remove_proc_entry(SYMLINK, NULL); 138 | if (proc_file) 139 | remove_proc_entry(FILENAME, proc_dir); 140 | if (proc_dir) 141 | remove_proc_entry(DIRNAME, NULL); 142 | } 143 | 144 | static void __exit exit_seq_file_module(void) { 145 | cleanup_seq_file_module(); 146 | printk(KERN_INFO "seq_file: unloaded\n"); 147 | } 148 | 149 | module_init(init_seq_file_module); 150 | module_exit(exit_seq_file_module); 151 | 152 | ssize_t seq_file_write(struct file *filep, const char __user *buf, 153 | size_t len, loff_t *offp) { 154 | 155 | printk(KERN_INFO "seq_file: write\n"); 156 | 157 | int avail = (MAX_COOKIE_LENGTH - cookie_index) + 1; 158 | 159 | if(len > avail) { 160 | printk(KERN_ERR "seq_file: cookie_pot overflow\n"); 161 | return -ENOSPC; 162 | } 163 | 164 | if(copy_from_user(&cookie_pot[cookie_index], buf, len)) { 165 | 166 | printk(KERN_ERR "seq_file: copy from user error\n"); 167 | return -EFAULT; 168 | } 169 | 170 | cookie_index += len; 171 | cookie_pot[cookie_index-1] = '\0'; 172 | 173 | return len; 174 | } 175 | -------------------------------------------------------------------------------- /sem6/lab2/src/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #define __USE_XOPEN 7 | #define __USE_XOPEN_EXTENDED 8 | #include 9 | #include 10 | #include 11 | #include 12 | 13 | #include "color.h" 14 | 15 | #define __NOT_DIR 1 16 | #define __DIR 2 17 | #define __DENIED 3 18 | 19 | static char __color_s[1488]; 20 | 21 | typedef int __handler_fn_t(const char *filename, const struct stat *st, 22 | int depth, int type); 23 | 24 | static char *random_color(); 25 | static __handler_fn_t work_handler; 26 | static int dopath(const char *filename, int depth, __handler_fn_t *); 27 | 28 | int main(const int argc, const char **argv) { 29 | srand(time(NULL)); 30 | 31 | if (argc != 2) { 32 | fprintf(stderr, "Usage: %s \n", argv[0]); 33 | return EXIT_FAILURE; 34 | } 35 | 36 | return dopath(argv[1], 0, work_handler); 37 | } 38 | 39 | static int dopath(const char *filename, int depth, __handler_fn_t *func) { 40 | struct stat statbuf; 41 | 42 | if (lstat(filename, &statbuf) == -1) { 43 | /* lstat error */ 44 | return EXIT_FAILURE; 45 | } 46 | 47 | if (S_ISDIR(statbuf.st_mode) == 0) { 48 | /* not directory */ 49 | return func(filename, &statbuf, depth, __NOT_DIR); 50 | } 51 | 52 | int status; 53 | if ((status = func(filename, &statbuf, depth, __DIR)) != EXIT_SUCCESS) { 54 | /* directory */ 55 | return status; 56 | } 57 | 58 | DIR *dp; 59 | if ((dp = opendir(filename)) == NULL) { 60 | /* denied */ 61 | return func(filename, &statbuf, depth, __DENIED); 62 | } 63 | 64 | chdir(filename); 65 | int dir = (strcmp(filename, ".") == 0 || strcmp(filename, "..") == 0); 66 | struct dirent *dentry; 67 | while (!dir && (dentry = readdir(dp)) != NULL) { 68 | // Рязанова хочет убрать это из цикла 69 | // можно до входа в цикл проверить имя файла 70 | if (strcmp(dentry->d_name, ".") == 0 || 71 | strcmp(dentry->d_name, "..") == 0) { 72 | continue; 73 | } 74 | 75 | /* recursive call */ 76 | if ((status = dopath(dentry->d_name, depth + 1, func)) != 77 | EXIT_SUCCESS) { 78 | /* exit on error */ 79 | return status; 80 | } 81 | } 82 | chdir(".."); 83 | 84 | if (closedir(dp) == -1) { 85 | fprintf(stderr, "closedir(%s): %s", filename, strerror(errno)); 86 | } 87 | 88 | return status; 89 | } 90 | 91 | static int work_handler(const char *filename, const struct stat *st, int depth, 92 | int type) { 93 | for (int i = 0; i + 1 < depth; ++i) { 94 | printf("│ "); 95 | } 96 | 97 | const char *s = ""; 98 | 99 | switch (type) { 100 | case __NOT_DIR: 101 | #ifdef __RND_COLOR 102 | s = random_color(); 103 | #else 104 | switch (st->st_mode & S_IFMT) { 105 | case S_IFREG: 106 | s = st->st_mode & S_IXUSR ? COLOR_EXE : COLOR_REG; 107 | break; 108 | case S_IFBLK: 109 | s = COLOR_BLK; 110 | break; 111 | case S_IFCHR: 112 | s = COLOR_CHR; 113 | break; 114 | case S_IFIFO: 115 | s = COLOR_FIFO; 116 | break; 117 | case S_IFLNK: 118 | s = COLOR_LINK; 119 | break; 120 | case S_IFSOCK: 121 | s = COLOR_SOCK; 122 | break; 123 | case S_IFDIR: 124 | fprintf(stderr, "Dir file type is not expected\n"); 125 | return EXIT_FAILURE; 126 | default: 127 | fprintf(stderr, "Unknown file type '%s': %d\n", filename, 128 | st->st_mode & S_IFMT); 129 | return EXIT_FAILURE; 130 | } 131 | #endif 132 | printf("├── %s%s%s %d\n", s, filename, COLOR_RESET, st->st_ino); 133 | break; 134 | case __DIR: 135 | printf("%s%s%s%s %d\n", depth ? "├── " : "", COLOR_DIR, filename, 136 | COLOR_RESET, st->st_ino); 137 | break; 138 | case __DENIED: 139 | fprintf(stderr, "Can't read directory %s: %s\n", filename, 140 | strerror(errno)); 141 | return EXIT_FAILURE; 142 | default: 143 | fprintf(stderr, "Unknown file type: %d\n", type); 144 | return EXIT_FAILURE; 145 | } 146 | 147 | return EXIT_SUCCESS; 148 | } 149 | 150 | __always_inline static char *random_color() { 151 | int bg = rand() % BG_SPEC_SIZE; 152 | int c = rand() % COLOR_LIST_SIZE; 153 | 154 | *__color_s = 0; 155 | sprintf(__color_s, "%s %s", COLOR_LIST[c], BG_SPECS[bg]); 156 | 157 | return __color_s; 158 | } 159 | -------------------------------------------------------------------------------- /sem6/lab4/part1/stat.txt: -------------------------------------------------------------------------------- 1 | creds: @Justarone 2 | 3 | 1) pid - уникальный идентификатор процесса. 4 | 2) comm - имя исполняемого файла в круглых скобках. 5 | 3) state - состояние процесса. 6 | 4) ppid - уникальный идентификатор процесса-предка. 7 | 5) pgrp - уникальный идентификатор группы. 8 | 6) session - уникальный идентификатор сессии. 9 | 7) tty_nr – управляющий терминал. 10 | 8) tpgid – уникальный идентификатор группы управляющего терминала. 11 | 9) flags – флаги. 12 | 10) minflt - Количество незначительных сбоев, которые возникли при выполнении процесса, и которые не требуют загрузки страницы памяти с диска. 13 | 11) cminflt - количество незначительных сбоев, которые возникли при ожидании окончания работы процессов-потомков. 14 | 12) majflt - количество значительных сбоев, которые возникли при работе процесса, и которые потребовали загрузки страницы памяти с диска. 15 | 13) cmajflt - количество значительных сбоев, которые возникли при ожидании окончания работы процессов-потомков. 16 | 14) utime - количество тиков, которые данный процесс провел в режиме пользователя. 17 | 15) stime - количество тиков, которые данный процесс провел в режиме ядра. 18 | 16) cutime - количество тиков, которые процесс, ожидающий завершения процессов-потомков, провёл в режиме пользователя. 19 | 17) cstime - количество тиков, которые процесс, ожидающий завершения процессов-потомков, провёл в режиме ядра. 20 | 18) priority – для процессов реального времени это отрицательный приоритет планирования минус один, то есть число в диапазоне от -2 до -100, соответствующее приоритетам в реальном времени от 1 до 99. Для остальных процессов это необработанное значение nice, представленное в ядре. Ядро хранит значения nice в виде чисел в диапазоне от 0 (высокий) до 39 (низкий), соответствующих видимому пользователю диапазону от -20 до 19. 21 | 19) nice - значение для nice в диапазоне от 19 (наиболее низкий приоритет) до -20 (наивысший приоритет). 22 | 20) num_threads – число потоков в данном процессе. 23 | 21) itrealvalue – количество мигов до того, как следующий SIGALARM будет послан процессу интервальным таймером. С ядра версии 2.6.17 больше не поддерживается и установлено в 0. 24 | 22) starttime - время в тиках запуска процесса после начальной загрузки системы. 25 | 23) vsize - размер виртуальной памяти в байтах. 26 | 24) rss - резидентный размер: количество страниц, которые занимает процесс в памяти. Это те страницы, которые заняты кодом, данными и пространством стека. Сюда не включаются страницы, которые не быи загружены по требованию или которые находятся в своппинге. 27 | 25) rsslim - текущий лимит в байтах на резидентный размер процесса. 26) startcode - адрес, выше которого может выполняться код программы. 28 | 27) endcode - адрес, ниже которого может выполняться код программ. 29 | 28) startstack - адрес начала стека. 30 | 29) kstkesp - текущее значение ESP (указателя стека). 31 | 30) kstkeip - текущее значение EIP (указатель команд). 32 | 31) signal - битовая карта ожидающих сигналов. Устарела, потому что не предоставляет информацию о сигналах реального времени, необходимо использовать /proc/[pid]/status. 33 | 32) blocked - битовая карта блокируемых сигналов. Устарела, потому что не предоставляет информацию о сигналах реального времени, необходимо использовать /proc/[pid]/status. 34 | 33) sigignore - битовая карта игнорируемых сигналов. Устарела, потому что не предоставляет информацию о сигналах реального времени, необходимо использовать /proc/[pid]/status. 35 | 34) sigcatch - битовая карта перехватываемых сигналов. Устарела, потому что не предоставляет информацию о сигналах реального времени, необходимо использовать /proc/[pid]/status. 36 | 35) wchan - "канал", в котором ожидает процесс. 37 | 36) nswap - количество страниц на своппинге (не обслуживается). 38 | 37) сnswap - суммарное nswap для процессов-потомков (не обслуживается). 39 | 38) exit_signal - сигнал, который будет послан предку, когда процесс завершится. 40 | 39) processor - номер процессора, на котором последний раз выполнялся процесс. 41 | 40) rt_priority - приоритет планирования реального времени, число в диапазоне от 1 до 99 для процессов реального времени, 0 для остальных. 42 | 41) policy - политика планирования. 43 | 42) delayacct_blkio_ticks - суммарные задержки ввода/вывода в тиках. 44 | 43) guest_time – гостевое время процесса (время, потраченное на выполнение виртуального процессора на гостевой операционной системе) в тиках. 45 | 44) cguest_time - гостевое время для потомков процесса в тиках. 46 | 45) start_data - адрес, выше которого размещаются инициализированные и неинициализированные (BSS) данные программы. 47 | 46) end_data - адрес, ниже которого размещаются инициализированные и неинициализированные (BSS) данные программы. 48 | 47) start_brk - адрес, выше которого куча программы может быть расширена с использованием brk(). 49 | 48) arg_start - адрес, выше которого размещаются аргументы командной строки (argv). 50 | 49) arg_end - адрес, ниже которого размещаются аргументы командной строки (argv). 51 | 50) env_start - адрес, выше которого размещается окружение программы. 52 | 51) env_end - адрес, ниже которого размещается окружение программы. 53 | 52) exit_code – статус завершения потока в форме, возвращаемой waitpid(). 54 | -------------------------------------------------------------------------------- /sem6/lab1/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | 16 | #define LOCKFILE "/var/run/lab1_daemon.pid" 17 | #define LOCKMODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) 18 | 19 | sigset_t mask; 20 | 21 | void daemonize(const char *cmd) { 22 | int i, fd0, fd1, fd2; 23 | pid_t pid; 24 | struct rlimit rl; 25 | struct sigaction sa; 26 | 27 | umask(0); // 1 28 | 29 | if (getrlimit(RLIMIT_NOFILE, &rl) < 0) { 30 | puts("getrlimit error"); 31 | exit(1); 32 | } 33 | 34 | // 2 35 | if ((pid = fork()) < 0) { 36 | puts("Error during fork"); 37 | exit(1); 38 | } else if (pid != 0) { 39 | exit(0); 40 | } 41 | 42 | // 3 43 | if (setsid() == -1) { 44 | puts("setsid error setsid"); 45 | exit(1); 46 | } 47 | 48 | sa.sa_handler = SIG_IGN; 49 | sigemptyset(&sa.sa_mask); 50 | sa.sa_flags = 0; 51 | 52 | if (sigaction(SIGHUP, &sa, NULL) < 0) { 53 | puts("sigaction failed to ignore sighup"); 54 | exit(1); 55 | } 56 | 57 | // 4 58 | if (chdir("/") < 0) { 59 | puts("chdir / failed"); 60 | exit(1); 61 | } 62 | 63 | if (rl.rlim_max == RLIM_INFINITY) { 64 | rl.rlim_max = 1024; 65 | } 66 | 67 | // 5 68 | for (i = 0; i < rl.rlim_max; i++) { 69 | close(i); 70 | } 71 | 72 | // 6 73 | fd0 = open("dev/null", O_RDWR); 74 | fd1 = dup(0); 75 | fd2 = dup(0); 76 | 77 | openlog(cmd, LOG_CONS, LOG_DAEMON); 78 | if (fd0 != -0 || fd1 != 1 || fd2 != 2) { 79 | syslog(LOG_ERR, "File descriptors problems %d %d %d", fd0, fd1, fd2); 80 | exit(1); 81 | } 82 | syslog(LOG_WARNING, "Daemon started!"); 83 | } 84 | 85 | int already_running(void) { 86 | syslog(LOG_ERR, "Check if already running"); 87 | 88 | int fd; 89 | char buf[16]; 90 | 91 | fd = open(LOCKFILE, O_RDWR | O_CREAT, LOCKMODE); 92 | 93 | if (fd < 0) { 94 | syslog(LOG_ERR, "Cant open lockfile %s: %s", LOCKFILE, 95 | strerror(errno)); 96 | exit(1); 97 | } 98 | 99 | syslog(LOG_WARNING, "Lock file opened"); 100 | 101 | if (flock(fd, LOCK_EX | LOCK_NB) != 0) { 102 | if (errno == EWOULDBLOCK) { 103 | syslog(LOG_ERR, "Daemon is already running %s: %s", LOCKFILE, 104 | strerror(errno)); 105 | close(fd); 106 | exit(1); 107 | } 108 | 109 | syslog(LOG_ERR, "Invalid FD"); 110 | exit(1); 111 | } 112 | 113 | ftruncate(fd, 0); 114 | sputs(buf, "%ld", (long)getpid()); 115 | write(fd, buf, strlen(buf) + 1); 116 | 117 | syslog(LOG_WARNING, "PID writed"); 118 | 119 | return 0; 120 | } 121 | 122 | void log_time() { 123 | time_t raw_time; 124 | struct tm *time_info; 125 | char buf[70]; 126 | 127 | time(&raw_time); 128 | time_info = localtime(&raw_time); 129 | syslog(LOG_INFO, (asctime(time_info))); 130 | } 131 | 132 | void *thr_fn(void *arg) { 133 | int signo; 134 | int code_error = 0; 135 | while (!code_error) { 136 | code_error = sigwait(&mask, &signo); 137 | switch (signo) { 138 | case SIGHUP: 139 | syslog(LOG_INFO, "--- SIGHUP"); 140 | break; 141 | case SIGTERM: 142 | syslog(LOG_INFO, "--- SIGTERM - KILL APP"); 143 | return 0; 144 | break; 145 | default: 146 | syslog(LOG_INFO, "--- UNKNOWN SIGNAL - %d", signo); 147 | break; 148 | } 149 | } 150 | } 151 | 152 | int main(int argc, char *argv[]) { 153 | int err; 154 | pthread_t tid; 155 | char *cmd; 156 | struct sigaction sa; 157 | 158 | if ((cmd = strrchr(argv[0], '/')) == NULL) { 159 | cmd = argv[0]; 160 | } else 161 | cmd++; 162 | 163 | daemonize(cmd); 164 | 165 | if (already_running() != 0) { 166 | syslog(LOG_ERR, "Daemon is already running\n"); 167 | exit(1); 168 | } 169 | 170 | sa.sa_handler = SIG_DFL; 171 | sigemptyset(&sa.sa_mask); 172 | 173 | sa.sa_flags = 0; 174 | 175 | if (sigaction(SIGHUP, &sa, NULL) < 0) { 176 | syslog(LOG_ERR, "sigaction failed SIG_DFL on SIGHUP\n"); 177 | exit(1); 178 | } 179 | 180 | sigfillset(&mask); 181 | if ((err = pthread_sigmask(SIG_BLOCK, &mask, NULL)) != 0) { 182 | syslog(LOG_ERR, "pthread_sigmask failed SIG_BLOCK\n"); 183 | exit(1); 184 | } 185 | 186 | err = pthread_create(&tid, NULL, thr_fn, 0); 187 | if (err != 0) { 188 | syslog(LOG_ERR, "Thread creation failed\n"); 189 | exit(1); 190 | } 191 | 192 | for (int i = 0; i < 100; ++i) { 193 | log_time(); 194 | sleep(3); 195 | } 196 | 197 | pthread_join(tid, NULL); 198 | 199 | exit(0); 200 | } 201 | -------------------------------------------------------------------------------- /sem6/lab5/report/tex/lab.tex: -------------------------------------------------------------------------------- 1 | \section*{1. Структура \texttt{\_IO\_FILE}} 2 | 3 | \begin{lstinputlisting}[ 4 | caption={Структура \texttt{\_IO\_FILE}}, 5 | style={c}, 6 | ]{../src/struct_io_file.c} 7 | \end{lstinputlisting} 8 | 9 | \clearpage 10 | 11 | \section*{2. Первая программа} 12 | 13 | \begin{figure}[h!btp] 14 | \centering 15 | \includegraphics[width=490pt]{inc/scheme1.pdf} 16 | \caption{Используемые структуры} 17 | \label{fig:scheme1} 18 | \end{figure} 19 | 20 | \begin{itemize} 21 | \item Функция \texttt{open()} создает новый файловый дескриптор \texttt{fd} файла (открытого только на чтение) ''\texttt{alphabet.txt}'' запись в системной таблице открытых файлов. Эта запись регистрирует смещение в файле и флаги состояния файла 22 | 23 | \item Функция \texttt{fdopen()} создаёт указатели на структуру \texttt{FILE}. Поле \texttt{\_fileno} содержит дескриптор, который вернула функция \texttt{fopen()} 24 | 25 | \item Функция \texttt{setvbuf()} явно задает размер буффера в 20 байт и меняет тип буферизации (для \texttt{fs1} и \texttt{fs2}) на полную 26 | 27 | \item При первом вызове функции \texttt{fscanf()} в цикле (для \texttt{fs1}), \texttt{buff1} будет заполнен полностью -- первыми 20 символами (буквами алфавита). \texttt{f\_pos} в структуре \texttt{struct\_file} открытого файла увеличится на 20 28 | 29 | \item При втором вызове \texttt{fscanf()} в цикле (для \texttt{fs2}) буффер \texttt{buff2} будет заполнен оставшимися 6 символами (начиная с \texttt{f\_pos}) 30 | 31 | \item В цикле поочерёдно выводятся символы из \texttt{buff1} и \texttt{buff2} 32 | \end{itemize} 33 | 34 | \clearpage 35 | 36 | \begin{lstinputlisting}[ 37 | caption={Исходный код первой программы}, 38 | style={c}, 39 | ]{../src/1.c} 40 | \end{lstinputlisting} 41 | 42 | \begin{figure}[h!btp] 43 | \centering 44 | \includegraphics[width=400pt]{inc/1.png} 45 | \caption{Результат работы первой программы} 46 | \label{fig:res1} 47 | \end{figure} 48 | 49 | \clearpage 50 | 51 | \begin{lstinputlisting}[ 52 | caption={Исходный код первой программы (многопоточная)}, 53 | style={c}, 54 | ]{../src/1m.c} 55 | \end{lstinputlisting} 56 | 57 | \begin{figure}[h!btp] 58 | \centering 59 | \includegraphics[width=400pt]{inc/1m.png} 60 | \caption{Результат работы первой программы (многопоточная)} 61 | \label{fig:res1m} 62 | \end{figure} 63 | 64 | \clearpage 65 | 66 | \section*{3. Вторая программа} 67 | 68 | \begin{figure}[h!btp] 69 | \centering 70 | \includegraphics[width=490pt]{inc/scheme2.pdf} 71 | \caption{Используемые структуры} 72 | \label{fig:scheme2} 73 | \end{figure} 74 | 75 | \begin{itemize} 76 | \item Функция \texttt{open()} создаёт файловые дескрипторы, два раза для одного и того же файла, поэтому в программе существует две различные \texttt{struct file}, но ссылающиеся на один и тот же \texttt{struct inode} 77 | 78 | \item Из-за того что структуры разные, посимвольная печать просто дважды выведет содержимое файла в формате <<\texttt{aabbcc...}>> (в случае однопоточной реализации); 79 | 80 | \item В случае многопоточной реализации, вывод второго потока начнётся позже (нужно время, для создание этого потока) и символы перемешаются, что видно на рисунке \ref{fig:res2m} 81 | \end{itemize} 82 | 83 | \clearpage 84 | 85 | \begin{lstinputlisting}[ 86 | caption={Исходный код второй программы}, 87 | style={c}, 88 | ]{../src/2.c} 89 | \end{lstinputlisting} 90 | 91 | \begin{figure}[h!btp] 92 | \centering 93 | \includegraphics[width=400pt]{inc/2.png} 94 | \caption{Результат работы второй программы} 95 | \label{fig:res2} 96 | \end{figure} 97 | 98 | \clearpage 99 | 100 | \begin{lstinputlisting}[ 101 | caption={Исходный код второй программы (многопоточная)}, 102 | style={c}, 103 | ]{../src/2m.c} 104 | \end{lstinputlisting} 105 | 106 | \begin{figure}[h!btp] 107 | \centering 108 | \includegraphics[width=400pt]{inc/2m.png} 109 | \caption{Результат работы второй программы (многопоточная)} 110 | \label{fig:res2m} 111 | \end{figure} 112 | 113 | \clearpage 114 | 115 | \section*{3. Третья программа} 116 | 117 | \begin{figure}[h!btp] 118 | \centering 119 | \includegraphics[width=470pt]{inc/scheme3.pdf} 120 | \caption{Используемые структуры} 121 | \label{fig:scheme3} 122 | \end{figure} 123 | 124 | \begin{itemize} 125 | \item Файл открывается на запись два раза функцией \texttt{fopen()} 126 | 127 | \item Функция \texttt{fprintf()} предоставляет буферизованный вывод 128 | 129 | \item Изначально информация пишется в буфер, а из буфера в файл если произошло одно из 130 | событий: 131 | \begin{enumerate} 132 | \item буффер полон 133 | \item вызвана функция \texttt{fclose()} 134 | \item вызвана функция \texttt{fflush()} 135 | \end{enumerate} 136 | 137 | \item В случае нашей программы, информация в файл запишется в результате вызова функция \texttt{fclose()} 138 | 139 | \item Из-за того \texttt{f\_pos} независимы для каждого дескриптора файла, запись в файл будет производится с нулевой позиции 140 | \end{itemize} 141 | 142 | \clearpage 143 | 144 | \begin{lstinputlisting}[ 145 | caption={Исходный код Третьей программы}, 146 | style={c}, 147 | ]{../src/3.c} 148 | \end{lstinputlisting} 149 | 150 | \begin{figure}[h!btp] 151 | \centering 152 | \includegraphics[width=400pt]{inc/3.png} 153 | \caption{Результат работы третьей программы} 154 | \label{fig:res3} 155 | \end{figure} 156 | 157 | \clearpage 158 | 159 | \begin{lstinputlisting}[ 160 | caption={Исходный код третьей программы (многопоточная)}, 161 | style={c}, 162 | ]{../src/3m.c} 163 | \end{lstinputlisting} 164 | 165 | \begin{figure}[h!btp] 166 | \centering 167 | \includegraphics[width=400pt]{inc/3m.png} 168 | \caption{Результат работы третьей программы (многопоточная)} 169 | \label{fig:res3m} 170 | \end{figure} -------------------------------------------------------------------------------- /sem6/lab4/part1/const.h: -------------------------------------------------------------------------------- 1 | #ifndef __CONST__ 2 | #define __CONST__ 3 | 4 | const char *WITH_DESCR[] = { 5 | "(1) pid '%s' The process ID.\n", 6 | "(2) comm '%s' (The filename of the executable, in parentheses).\n", 7 | "(3) state '%s' (one of the characters indicating process state).\n", 8 | "(4) ppid '%s' (The PID of the parent of this process).\n", 9 | "(5) pgrp '%s' (The process group ID of the process).\n", 10 | "(6) session '%s' (The session ID of the process).\n", 11 | "(7) tty_nr '%s' (The controlling terminal of the process).\n", 12 | "(8) tpgid '%s' (The ID of the foreground process group of the controlling terminal of the process).\n", 13 | "(9) flags '%s' (The kernel flags word of the process).\n", 14 | "(10) minflt '%s' (The number of minor faults the process has made which have not required loading a memory page from disk).\n", 15 | "(11) cminflt '%s' (The number of minor faults that the process's waited-for children have made).\n", 16 | "(12) majflt '%s' (The number of major faults the process has made which have required loading a memory page from disk).\n", 17 | "(13) cmajflt '%s' (The number of major faults that the process's waited-for children have made).\n", 18 | "(14) utime '%s' (Amount of time that this process has been scheduled in user mode, measured in clock ticks).\n", 19 | "(15) stime '%s' (Amount of time that this process has been scheduled in kernel mode, measured in clock ticks).\n", 20 | "(16) cutime '%s' (Amount of time that this process's waited-for children have been scheduled in user mode, measured in clock ticks).\n", 21 | "(17) cstime '%s' (Amount of time that this process's waited-for children have been scheduled in kernel mode, measured in clock ticks).\n", 22 | "(18) priority '%s' (For processes running a real-time scheduling policy).\n", 23 | "(19) nice '%s' (The nice value (see setpriority(2)), a value in the range 19 (low priority) to -20 (high priority)).\n", 24 | "(20) num_threads '%s' (Number of threads in this process (since Linux 2).6). Before kernel 2.6, this field was hardcoded to 0 as a placeholder for an earlier removed field.\n", 25 | "(21) itrealvalue '%s' (The time in jiffies before the next SIGALRM is sent to the process due to an interval timer).\n", 26 | "(22) starttime '%s' (The time the process started after system boot).\n", 27 | "(23) vsize '%s' (Virtual memory size in bytes).\n", 28 | "(24) rss '%s' (Resident Set Size: number of pages the process has in real memory).\n", 29 | "(25) rsslim '%s' (Current soft limit in bytes on the rss of the process).\n", 30 | "(26) startcode '%s' (The address above which program text can run).\n", 31 | "(27) endcode '%s' (The address below which program text can run).\n", 32 | "(28) startstack '%s' T(he address of the start (i).e., bottom) of the stack.\n", 33 | "(29) kstkesp '%s' T(he current value of ESP (stack pointer), as found in the kernel stack page for the process).\n", 34 | "(30) kstkeip '%s' T(he current EIP (instruction pointer)).\n", 35 | "(31) signal '%s' (The bitmap of pending signals, displayed as a decimal number).\n", 36 | "(32) blocked '%s' (The bitmap of blocked signals, displayed as a decimal number).\n", 37 | "(33) sigignore '%s' (The bitmap of ignored signals, displayed as a decimal number).\n", 38 | "(34) sigcatch '%s' (The bitmap of caught signals, displayed as a decimal number).\n", 39 | "(35) wchan '%s' T(his is the \"channel\" in which the process is waiting).\n", 40 | "(36) nswap '%s' (Number of pages swapped (not maintained)).\n", 41 | "(37) cnswap '%s' (Cumulative nswap for child processes (not maintained)).\n", 42 | "(38) exit_signal '%s' (since Linux 2.1.22) (Signal to be sent to parent when we die).\n", 43 | "(39) processor '%s' (since Linux 2.2.8) (CPU number last executed on).\n", 44 | "(40) rt_priority '%s' (since Linux 2.5.19) (Real-time scheduling priority, a number in the range 1 to 99 for processes scheduled under a real-time policy, or 0, for non-real-time processes).\n", 45 | "(41) policy '%s' (since Linux 2.5.19) (Scheduling policy).\n", 46 | "(42) delayacct_blkio_ticks '%s' (since Linux 2.6.18) (Aggregated block I/O delays, measured in clock ticks (centiseconds)).\n", 47 | "(43) guest_time '%s' (since Linux 2.6.24) (Guest time of the process (time spent running a virtual CPU for a guest operating system), measured in clock ticks).\n", 48 | "(44) cguest_time '%s' (since Linux 2.6.24) (Guest time of the process's children, measured in clock ticks).\n", 49 | "(45) start_data '%s' (since Linux 3.3) A(ddress above which program initialized and uninitialized (BSS) data are placed).\n", 50 | "(46) end_data '%s' (since Linux 3.3) A(ddress below which program initialized and uninitialized (BSS) data are placed).\n", 51 | "(47) start_brk '%s' (since Linux 3.3) A(ddress above which program heap can be expanded with brk(2)).\n", 52 | "(48) arg_start '%s' (since Linux 3.5) A(ddress above which program command-line arguments (argv) are placed).\n", 53 | "(49) arg_end '%s' (since Linux 3.5) A(ddress below program command-line arguments (argv) are placed).\n", 54 | "(50) env_start '%s' (since Linux 3.5) A(ddress above which program environment is placed).\n", 55 | "(51) env_end '%s' (since Linux 3.5) A(ddress below which program environment is placed).\n", 56 | "(52) exit_code '%s' (since Linux 3.5) T(he thread's exit status in the form reported by waitpid(2)).\n" 57 | }; 58 | 59 | const char *NO_DESCR[] = { 60 | "(1) pid '%s'\n", 61 | "(2) comm '%s'\n", 62 | "(3) state '%s'\n", 63 | "(4) ppid '%s'\n", 64 | "(5) pgrp '%s'\n", 65 | "(6) session '%s'\n", 66 | "(7) tty_nr '%s'\n", 67 | "(8) tpgid '%s'\n", 68 | "(9) flags '%s'\n", 69 | "(10) minflt '%s'\n", 70 | "(11) cminflt '%s'\n", 71 | "(12) majflt '%s'\n", 72 | "(13) cmajflt '%s'\n", 73 | "(14) utime '%s'\n", 74 | "(15) stime '%s'\n", 75 | "(16) cutime '%s'\n", 76 | "(17) cstime '%s'\n", 77 | "(18) priority '%s'\n", 78 | "(19) nice '%s'\n", 79 | "(20) num_threads '%s'\n", 80 | "(21) itrealvalue '%s'\n", 81 | "(22) starttime '%s'\n", 82 | "(23) vsize '%s'\n", 83 | "(24) rss '%s'\n", 84 | "(25) rsslim '%s'\n", 85 | "(26) startcode '%s'\n", 86 | "(27) endcode '%s'\n", 87 | "(28) startstack '%s'\n", 88 | "(29) kstkesp '%s'\n", 89 | "(30) kstkeip '%s'\n", 90 | "(31) signal '%s'\n", 91 | "(32) blocked '%s'\n", 92 | "(33) sigignore '%s'\n", 93 | "(34) sigcatch '%s'\n", 94 | "(35) wchan '%s'\n", 95 | "(36) nswap '%s'\n", 96 | "(37) cnswap '%s'\n", 97 | "(38) exit_signal '%s'\n", 98 | "(39) processor '%s'\n", 99 | "(40) rt_priority '%s'\n", 100 | "(41) policy '%s'\n", 101 | "(42) delayacct_blkio_ticks '%s'\n", 102 | "(43) guest_time '%s'\n", 103 | "(44) cguest_time '%s'\n", 104 | "(45) start_data '%s'\n", 105 | "(46) end_data '%s'\n", 106 | "(47) start_brk '%s'\n", 107 | "(48) arg_start '%s'\n", 108 | "(49) arg_end '%s'\n", 109 | "(50) env_start '%s'\n", 110 | "(51) env_end '%s'\n", 111 | "(52) exit_code '%s'\n" 112 | }; 113 | 114 | const char *STATM_PATTERNS[] = { 115 | "size %s (1)\n", 116 | "resident %s (2)\n", 117 | "shared %s (3)\n", 118 | "text %s (4)\n", 119 | "lib %s (5)\n", 120 | "data %s (6)\n", 121 | "dt %s (7)\n" 122 | }; 123 | 124 | #endif 125 | -------------------------------------------------------------------------------- /sem6/lab4/part1/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | #include "const.h" 12 | 13 | #define BUF_SIZE 10000 14 | 15 | #define NO_ACCESS 1 16 | #define BAD_ARGS 2 17 | 18 | void print_cmdline(const int pid) { 19 | char path[PATH_MAX]; 20 | snprintf(path, PATH_MAX, "/proc/%d/cmdline", pid); 21 | FILE *file = fopen(path, "r"); 22 | 23 | char buf[BUF_SIZE]; 24 | int len = fread(buf, 1, BUF_SIZE, file); 25 | buf[len - 1] = 0; 26 | printf("\nCMDLINE:\n%s\n", buf); 27 | 28 | fclose(file); 29 | } 30 | 31 | void print_environ(const int pid) { 32 | char pathToOpen[PATH_MAX]; 33 | snprintf(pathToOpen, PATH_MAX, "/proc/%d/environ", pid); 34 | FILE *file = fopen(pathToOpen, "r"); 35 | 36 | int len; 37 | char buf[BUF_SIZE]; 38 | printf("\nENVIRON:\n"); 39 | while ((len = fread(buf, 1, BUF_SIZE, file)) > 0) { 40 | for (int i = 0; i < len; i++) 41 | if (!buf[i]) buf[i] = '\n'; 42 | buf[len - 1] = '\n'; 43 | printf("%s", buf); 44 | } 45 | 46 | fclose(file); 47 | } 48 | 49 | void print_fd(const int pid) { 50 | char pathToOpen[PATH_MAX]; 51 | snprintf(pathToOpen, PATH_MAX, "/proc/%d/fd/", pid); 52 | DIR *dir = opendir(pathToOpen); 53 | 54 | printf("\nFD:\n"); 55 | 56 | struct dirent *readDir; 57 | char string[PATH_MAX]; 58 | char path[BUF_SIZE] = {'\0'}; 59 | while ((readDir = readdir(dir)) != NULL) { 60 | if ((strcmp(readDir->d_name, ".") != 0) && 61 | (strcmp(readDir->d_name, "..") != 0)) { 62 | sprintf(path, "%s%s", pathToOpen, readDir->d_name); 63 | int _read_len = readlink(path, string, PATH_MAX); 64 | printf("%s -> %s\n", readDir->d_name, string); 65 | } 66 | } 67 | 68 | closedir(dir); 69 | } 70 | 71 | void print_stat(const int pid) { 72 | char pathToOpen[PATH_MAX]; 73 | snprintf(pathToOpen, PATH_MAX, "/proc/%d/stat", pid); 74 | char buf[BUF_SIZE]; 75 | 76 | FILE *file = fopen(pathToOpen, "r"); 77 | fread(buf, 1, BUF_SIZE, file); 78 | char *token = strtok(buf, " "); 79 | 80 | printf("\nSTAT: \n"); 81 | 82 | for (int i = 0; token != NULL; i++) { 83 | printf(NO_DESCR[i], token); 84 | token = strtok(NULL, " "); 85 | } 86 | 87 | fclose(file); 88 | } 89 | 90 | void print_statm(const int pid) { 91 | char pathToOpen[PATH_MAX]; 92 | snprintf(pathToOpen, PATH_MAX, "/proc/%d/statm", pid); 93 | FILE *file = fopen(pathToOpen, "r"); 94 | char buf[BUF_SIZE]; 95 | fread(buf, 1, BUF_SIZE, file); 96 | 97 | char *token = strtok(buf, " "); 98 | printf("\nSTATM: \n"); 99 | for (int i = 0; token != NULL; i++) { 100 | printf(STATM_PATTERNS[i], token); 101 | token = strtok(NULL, " "); 102 | } 103 | fclose(file); 104 | } 105 | 106 | void print_cwd(const int pid) { 107 | char pathToOpen[PATH_MAX]; 108 | snprintf(pathToOpen, PATH_MAX, "/proc/%d/cwd", pid); 109 | char buf[BUF_SIZE] = {'\0'}; 110 | int _read_len = readlink(pathToOpen, buf, BUF_SIZE); 111 | printf("\nCWD:\n"); 112 | printf("%s\n", buf); 113 | } 114 | 115 | void print_io(const int pid) { 116 | char pathToOpen[PATH_MAX]; 117 | snprintf(pathToOpen, PATH_MAX, "/proc/%d/io", pid); 118 | char buf[BUF_SIZE] = {'\0'}; 119 | FILE *file = fopen(pathToOpen, "r"); 120 | printf("\nIO:\n"); 121 | int lengthOfRead; 122 | while ((lengthOfRead = fread(buf, 1, BUF_SIZE, file))) { 123 | buf[lengthOfRead] = '\0'; 124 | printf("%s\n", buf); 125 | } 126 | fclose(file); 127 | } 128 | 129 | void print_comm(const int pid) { 130 | char pathToOpen[PATH_MAX]; 131 | snprintf(pathToOpen, PATH_MAX, "/proc/%d/comm", pid); 132 | char buf[BUF_SIZE] = {'\0'}; 133 | FILE *file = fopen(pathToOpen, "r"); 134 | printf("\nCOMM:\n"); 135 | int lengthOfRead; 136 | while ((lengthOfRead = fread(buf, 1, BUF_SIZE, file))) { 137 | buf[lengthOfRead] = '\0'; 138 | printf("%s\n", buf); 139 | } 140 | fclose(file); 141 | } 142 | 143 | void print_exe(const int pid) { 144 | char pathToOpen[PATH_MAX]; 145 | snprintf(pathToOpen, PATH_MAX, "/proc/%d/exe", pid); 146 | char buf[BUF_SIZE] = {'\0'}; 147 | int _read_len = readlink(pathToOpen, buf, BUF_SIZE); 148 | printf("\nEXE:\n"); 149 | printf("%s\n", buf); 150 | } 151 | 152 | void print_maps(const int pid) { 153 | char pathToOpen[PATH_MAX]; 154 | snprintf(pathToOpen, PATH_MAX, "/proc/%d/maps", pid); 155 | char buf[BUF_SIZE] = {'\0'}; 156 | FILE *file = fopen(pathToOpen, "r"); 157 | printf("\nMAPS:\n"); 158 | int lengthOfRead; 159 | while ((lengthOfRead = fread(buf, 1, BUF_SIZE, file))) { 160 | buf[lengthOfRead] = '\0'; 161 | printf("%s\n", buf); 162 | } 163 | fclose(file); 164 | } 165 | 166 | void print_file(const int num) { 167 | char pathToOpen[PATH_MAX]; 168 | snprintf(pathToOpen, PATH_MAX, "/proc/%d/maps", num); 169 | char buf[BUF_SIZE] = {'\0'}; 170 | FILE *file = fopen(pathToOpen, "r"); 171 | int lengthOfRead; 172 | while ((lengthOfRead = fread(buf, 1, BUF_SIZE, file))) { 173 | buf[lengthOfRead] = '\0'; 174 | printf("%s\n", buf); 175 | } 176 | fclose(file); 177 | } 178 | 179 | void print_task(const int pid) { 180 | DIR *d; 181 | struct dirent *dir; 182 | 183 | char pathToOpen[PATH_MAX]; 184 | snprintf(pathToOpen, PATH_MAX, "/proc/%d/task", pid); 185 | 186 | d = opendir(pathToOpen); 187 | printf("\nTASK:\n"); 188 | if (d) { 189 | while ((dir = readdir(d)) != NULL) { 190 | printf("%s\n", dir->d_name); 191 | } 192 | closedir(d); 193 | } 194 | } 195 | 196 | void print_page(uint64_t address, uint64_t data) { 197 | printf("0x%-16lx : %-16lx %-10ld %-10ld %-10ld %-10ld\n", address, 198 | data & (((uint64_t)1 << 55) - 1), (data >> 55) & 1, (data >> 61) & 1, 199 | (data >> 62) & 1, (data >> 63) & 1); 200 | } 201 | 202 | void get_pagemap_info(const int pid) { 203 | printf("PAGEMAP\n"); 204 | printf(" addr : pfn soft-dirty file/shared swapped present\n"); 205 | 206 | char path[PATH_MAX]; 207 | snprintf(path, PATH_MAX, "/proc/%d/maps", pid); 208 | FILE *maps = fopen(path, "r"); 209 | 210 | snprintf(path, PATH_MAX, "/proc/%d/pagemap", pid); 211 | int pm_fd = open(path, O_RDONLY); 212 | char buf[BUF_SIZE + 1] = "\0"; 213 | 214 | int len; 215 | 216 | // чтение maps 217 | while ((len = fread(buf, 1, BUF_SIZE, maps)) > 0) { 218 | for (int i = 0; i < len; ++i) 219 | if (buf[i] == 0) buf[i] = '\n '; 220 | buf[len] = '\0 '; 221 | 222 | // проход по строкам из maps 223 | // используем strtok_r вместо strtok для возможности разбиения на 224 | // лексемы разных буферов 225 | char *save_row; 226 | char *row = strtok_r(buf, "\n", &save_row); 227 | 228 | while (row) { 229 | // получение столбца участка адресного пространства 230 | char *addresses = strtok(row, " "); 231 | char *start_str, *end_str; 232 | 233 | // получение начала и конца участка адресного пространства 234 | 235 | if ((start_str = strtok(addresses, "-")) && 236 | (end_str = strtok(NULL, "-"))) { 237 | uint64_t start = strtoul(start_str, NULL, 16); 238 | uint64_t end = strtoul(end_str, NULL, 16); 239 | 240 | for (uint64_t i = start; i < end; i += sysconf(_SC_PAGE_SIZE)) { 241 | uint64_t offset; 242 | // поиск смещения, по которому в pagemap находится 243 | // информация о текущей странице 244 | uint64_t index = 245 | i / sysconf(_SC_PAGE_SIZE) * sizeof(offset); 246 | 247 | pread(pm_fd, &offset, sizeof(offset), index); 248 | print_page(i, offset); 249 | } 250 | } 251 | row = strtok_r(NULL, "\n", &save_row); 252 | } 253 | } 254 | fclose(maps); 255 | close(pm_fd); 256 | } 257 | 258 | void print_root(const int pid) { 259 | char pathToOpen[PATH_MAX]; 260 | snprintf(pathToOpen, PATH_MAX, "/proc/%d/root", pid); 261 | char buf[BUF_SIZE] = {'\0'}; 262 | 263 | printf("\nROOT:\n"); 264 | printf("%s\n", buf); 265 | } 266 | 267 | int get_pid(int argc, char *argv[]) { 268 | if (argc < 2) { 269 | printf("Введите pid процесса для исследования!"); 270 | exit(BAD_ARGS); 271 | } 272 | 273 | int pid = atoi(argv[1]); 274 | char check_dir[PATH_MAX]; 275 | snprintf(check_dir, PATH_MAX, "/proc/%d", pid); 276 | if (!pid || access(check_dir, F_OK)) { 277 | printf("Директории для введенного pid не найдено"); 278 | exit(NO_ACCESS); 279 | } 280 | 281 | return pid; 282 | } 283 | 284 | int main(int argc, char *argv[]) { 285 | int pid = get_pid(argc, argv); 286 | print_cmdline(pid); 287 | print_fd(pid); 288 | print_environ(pid); 289 | print_stat(pid); 290 | print_statm(pid); 291 | print_cwd(pid); 292 | print_exe(pid); 293 | print_maps(pid); 294 | print_io(pid); 295 | print_comm(pid); 296 | print_root(pid); 297 | print_task(pid); 298 | 299 | get_pagemap_info(pid); 300 | return 0; 301 | } 302 | --------------------------------------------------------------------------------