Linux программирование в примерах
Linux программирование в примерах читать книгу онлайн
В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
При использовании
setpgid() pgidpidpgidpidИмеется несколько значений для особых случаев как для
pidpgidpid = 0 setpgid()pgidsetpgid(getpid(), pgid)pgid = 0 setpgid(pid, 0)setpgid(pid, pid)pidВо всех случаях лидеры сеанса являются особыми; их PID, ID группы процессов и ID сеанса идентичны, a ID группы процессов лидера не может быть изменена. (ID сеанса устанавливаются посредством
setsid()getsid()9.3. Базовое межпроцессное взаимодействие: каналы и очереди FIFO
Межпроцессное взаимодействие (Interprocess communication — IPC) соответствует своему названию: это способ взаимодействия для двух отдельных процессов. Самым старым способом IPC на системах Unix является канал (pipe): односторонняя линия связи. Данные, записанные в один конец канала, выходят из другого конца.
9.3.1. Каналы
Каналы проявляют себя как обычные дескрипторы файлов. Без особого разбирательства вы не можете сказать, представляет ли дескриптор файла сам файл или канал. Это особенность; программы, которые читают из стандартного ввода и записывают в стандартный вывод, не должны знать или заботиться о том, что они могут взаимодействовать с другим процессом. Если хотите знать, каноническим способом проверки этого является попытка выполнить с дескриптором '
lseek(fd, 0L, SEEK_CUR)9.3.1.1. Создание каналов
Системный вызов
pipe()#include <unistd.h> /* POSIX */int pipe(int filedes[2]);Значение аргумента является адресом массива из двух элементов целого типа,
pipe()Если вызов был успешным, у процесса теперь есть два дополнительных открытых дескриптора файла. Значение
filedes[0]filedes [1]Как упоминалось, данные, записанные в записываемый конец, считываются из читаемого конца. После завершения работы с каналом оба конца закрываются с помощью вызова
close()ch09-pipedemo.c1 /* ch09-pipedemo.c --- демонстрация ввода/вывода с каналом. */23 #include <stdio.h>4 #include <errno.h>5 #include <unistd.h>67 /* main --- создание канала, запись в него и чтение из него. */89 int main(int argc, char **argv)10 {11 static const char mesg[] = "Don't Panic!"; /* известное сообщение */12 char buf[BUFSIZ];13 ssize_t rcount, wcount;14 int pipefd[2];15 size_t l;1617 if (pipe(pipefd) < 0) {18 fprintf(stderr, "%s: pipe failed: %sn", argv[0],19 strerror(errno));20 exit(1);21 }2223 printf("Read end = fd %d, write end = fd %dn",24 pipefd[0], pipefd[1]);2526 l = strlen(mesg);27 if ((wcount = write(pipefd[1], mesg, 1)) != 1) {28 fprintf(stderr, "%s: write failed: %sn", argv[0],29 strerror(errno));30 exit(1);31 }3233 if ((rcount = read(pipefd[0], buf, BUFSIZ)) != wcount) {34 fprintf(stderr, "%s: read failed: %sn", argv[0],35 strerror(errno));36 exit(1);37 }3839 buf[rcount] = ' ';4041 printf("Read <%s> from pipen", buf);42 (void)close(pipefd[0]);43 (void)close(pipefd[1]);4445 return 0;46 }Строки 11–15 объявляют локальные переменные; наибольший интерес представляет
mesg
