Многопоточное программирование (лекция 4). Создание процессов, copy-on-write, атрибуты процесса, ожидание потомка
Содержание
- 2. Создание процессов pid_t fork();
- 3. Создание процессов pid_t fork(); pid_t vfork();
- 4. Создание процессов pid_t fork(); pid_t vfork(); pid_t forkpty(int *amaster, char *name, const struct termios *termp, const
- 5. Copy-on-write
- 6. Copy-on-write
- 7. Copy-on-write
- 8. Copy-on-write
- 9. Copy-on-write fork()
- 10. Copy-on-write fork()
- 11. Copy-on-write fork() ?
- 12. Copy-on-write fork() ?
- 13. Copy-on-write fork()
- 14. Дерево процессов init
- 15. Атрибуты процесса PID и PPID (Parent PID). pid_t getpid(); pid_t getppid();
- 16. Атрибуты процесса PID и PPID (Parent PID). pid_t getpid(); pid_t getppid(); // PID=1 для init. //
- 17. Атрибуты процесса UID, GID, EUID, EGID. // “Кто создал?” // (Реальные идентификаторы пользователя и группы). uid_t
- 18. Атрибуты процесса Корневой каталог. int chroot(const char *path); // --- /var/new_root/somefile.txt // --- chroot(“/var/new_root”); // ---
- 19. Атрибуты процесса Рабочий каталог. int chdir(const char *path); int fchdir(int fd);
- 20. Атрибуты процесса Приоритет. int nice(int incr); // NZERO = 20 // NICE = 0..39 // NICE-20
- 21. Атрибуты процесса Ограничения. int getrlimit(int resource, struct rlimit *rlp); int setrlimit(int resource, const struct rlimit *rlp);
- 22. Атрибуты процесса Ограничения. long ulimit(int cmd, …); // Устаревший int getrusage(int who, struct rusage *r_usage); //
- 23. Атрибуты процесса Переменные окружения. extern char **environ; // Имя=Значение // Имя=Значение // ... // Имя=Значение //
- 24. Порождение процесов Порождение процесса через exec. int execl(const char *path, const char *arg, ...); int execv(const
- 25. Порождение процесов Порождение процесса через exec. int execl(const char *path, const char *arg, ...); int execv(const
- 26. Порождение процесов Порождение процесса через exec. int execl(const char *path, const char *arg, ...); int execv(const
- 27. Порождение процесов Порождение процесса через exec. int execl(const char *path, const char *arg, ...); int execv(const
- 28. Порождение процесов Порождение процесса через exec. int execl(const char *path, const char *arg, ...); int execv(const
- 29. Порождение процесов Порождение процесса через system. int system(const char *command);
- 30. Ожидание потомка Как предотвратить зомби? pid_t waitpid(pid_t pid, int *statusp, int options); // pid // options
- 31. Исполнение процесса Рождение
- 32. Исполнение процесса Рождение Готовность
- 33. Исполнение процесса Рождение Готовность Выполнение Ожидание
- 34. Исполнение процесса Рождение Готовность Выполнение Ожидание Смерть
- 35. Сигналы read(…)
- 36. Сигналы read(…) SIGNAL
- 37. Сигналы read(…) SIGNAL errno = EINTR
- 38. Сигналы Основые типы сигналов. kill –l SIGABRT SIGALRM SIGCHLD SIGINT SIGTERM SIGKILL SIGUSR1 SIGUSR2 SIGHUP SIGRTMIN
- 39. Сигналы ANSI C. void handler(int signum) { // ... } // ANSI C signal(SIGUSR1, handler); signal(SIGUSR2,
- 40. Сигналы POSIX. // POSIX struct sigaction { void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); sigset_t
- 41. Сигналы POSIX. // POSIX struct sigaction { void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); sigset_t
- 42. Сигналы POSIX. // POSIX struct sigaction { void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); sigset_t
- 43. Сигналы POSIX. // POSIX struct sigaction { void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); sigset_t
- 44. Сигналы POSIX. // POSIX struct sigaction { void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); sigset_t
- 45. Сигналы siginfo_t. union sigval { int sival_int; void *sival_ptr; }; typedef struct { int si_signo; int
- 46. Сигналы Отправка и ожидание сигнала. int kill(pid_t pid, int signum); int sigqueue(pid_t pid, int sig, const
- 47. Сигналы Безопасность. volatile sig_atomic_t GlobalVariable;
- 48. Блокировка File
- 49. Блокировка File PID PID PID PID PID
- 50. Блокировка File PID PID PID PID PID READ WRITE
- 51. Блокировка File PID PID PID PID PID Exclusive lock Exclusive lock
- 52. Блокировка File PID PID PID PID PID
- 53. Блокировка File PID PID PID PID PID
- 54. Блокировка File PID PID PID PID PID
- 55. Блокировка File PID PID PID PID PID Exclusive lock Exclusive lock Exclusive lock Exclusive lock
- 56. Блокировка File PID PID PID PID PID Exclusive lock Exclusive lock Exclusive lock Exclusive lock
- 57. Блокировка File PID PID PID PID PID Exclusive lock Exclusive lock Exclusive lock Exclusive lock
- 58. Блокировка File PID PID PID PID PID Shared lock Shared lock Shared lock Exclusive lock
- 59. Блокировка Блокировки в коде. flock(fd, LOCK_EX); flock(fd, LOCK_SH); flock(fd, LOCK_UN); flock(fd, LOCK_EX | LOCK_NB); flock(fd, LOCK_SH
- 60. Файлы блокировок Что мы хотим? if(lock(“filename”)) { // Какие-то действия unlock(“filename”); } else { // ...
- 61. Файлы блокировок Реализация lock(). bool lock(char *filename) { int fd; if(fd = open(filename, O_WRONLY | O_CREATE
- 62. Файлы блокировок Реализация lock(). bool lock(char *filename) { int fd; if(fd = open(filename, O_WRONLY | O_CREATE
- 63. Файлы блокировок Реализация lock(). bool lock(char *filename) { int fd; if(fd = open(filename, O_WRONLY | O_CREATE
- 64. Файлы блокировок Реализация unlock(). bool unlock(char *filename) { unlink(filename); return true; }
- 65. Общие смещения в файлах Какой-то файл…
- 66. Общие смещения в файлах Какой-то файл… Процесс 1
- 67. Общие смещения в файлах Какой-то файл… Процесс 1
- 68. Общие смещения в файлах Какой-то файл… Процесс 1
- 69. Общие смещения в файлах Какой-то файл… Процесс 1 fd
- 70. Общие смещения в файлах Какой-то файл… Процесс 1 fd Процесс 2 fd fork()
- 71. Общие смещения в файлах Какой-то файл… Процесс 1 fd Процесс 2 fd fork() Position
- 72. Общие смещения в файлах Какой-то файл… Процесс 1 fd Процесс 2 fd fork() Position
- 73. Общие смещения в файлах Какой-то файл… Процесс 1 fd Процесс 2 fd fork() Position lseek(fd, NUMBER,
- 74. Общие смещения в файлах Какой-то файл… Процесс 1 fd Процесс 2 fd fork() Position lseek(fd, NUMBER,
- 75. Неименованные каналы int pipe(int fd[2]);
- 76. Неименованные каналы fd[1] fd[0]
- 77. Неименованные каналы fd[1] fd[0] Канал
- 78. Неименованные каналы fd[1] fd[0] Канал
- 79. Неименованные каналы fd[1] fd[0] Канал
- 80. Неименованные каналы fd[1] fd[0] Канал fd[1] fd[0]
- 81. Неименованные каналы fd[1] fd[0] Канал fd[1] fd[0]
- 82. Неименованные каналы fd[1] fd[0] Канал fd[1] fd[0]
- 83. Неименованные каналы fd[1] fd[0] Канал fd[1] fd[0]
- 84. Неименованные каналы fd[1] fd[0] Канал fd[1] fd[0]
- 85. Неименованные каналы Канал
- 86. Неименованные каналы Канал PIPE_BUF
- 87. Неименованные каналы Канал PIPE_BUF long v = fpathconf(pfd[0], _PC_PIPE_BUF);
- 88. Неименованные каналы Пример конвейера. who | sort | uniq | wc
- 89. Неименованные каналы who stdout stdin sort stdout stdin uniq stdout stdin wc
- 90. Неименованные каналы who stdout stdin sort stdout stdin uniq stdout stdin wc
- 91. Неименованные каналы who stdout stdin sort stdout stdin uniq stdout stdin wc Канал 1
- 92. Неименованные каналы who stdout stdin sort stdout stdin uniq stdout stdin wc Канал 1 Канал 2
- 93. Неименованные каналы who stdout stdin sort stdout stdin uniq stdout stdin wc Канал 1 Канал 2
- 94. Неименованные каналы Дублирование дескрипторов. int dup(int oldfd); int dup2(int oldfd, int newfd); // dup2(N, N) =
- 95. Неименованные каналы Пример конвеера. void who_wc() { int pfd[2]; pipe(pfd); if(!fork()) { close(STDOUT_FILENO); dup2(pfd[1], STDOUT_FILENO); close(pfd[0]);
- 96. Неименованные каналы popen и pclose. FILE *popen(const char *command, const char *type); int pclose(FILE *stream);
- 97. Неименованные каналы Двусторонние каналы. int socketpair(int d, /* AF_UNIX */ int type, int protocol, int sv[2]);
- 98. Именованные каналы FIFO. int mkfifo(const char *path, mode_t perms);
- 100. Скачать презентацию