Чтение онлайн

на главную - закладки

Жанры

UNIX: взаимодействие процессов

Стивенс Уильям Ричард

Шрифт:

65 err_doit(int errnoflag, int level, const char *fmt, va_list ap)

66 {

67 int errno_save, n;

68 char buf[MAXLINE];

69 errno_save = errno; /* значение может понадобиться вызвавшему */

70 #ifdef HAVE_VSNPRINTF

71 vsnprintf(buf, sizeof(buf), fmt, ар); /* защищенный вариант */

72 #else

73 vsprintf(buf, fmt, ар); /* незащищенный вариант */

74 #endif

75 n = strlen(buf);

76 if (errnoflag)

77 snprintf(buf+n, sizeof(buf)-n, ": %s", strerror(errno_save));

78 strcat(buf, "\n");

79 if (daemon_proc) {

80 syslog(level, buf);

81 } else {

82 fflush(stdout); /* если stdout и stderr одинаковы */

83 fputs(buf, stderr);

84 fflush(stderr);

85 }

86 return;

87 }

ПРИЛОЖЕНИЕ Г

Решения некоторых упражнений

Глава 1

1. В обоих процессах нужно лишь указать флаг O_APPEND при вызове функции open или режим дополнения файла при вызове fopen. Ядро гарантирует, что данные будут дописываться в конец файла. Это самая простая форма синхронизации доступа к файлу. На с. 60-61 [21] об этом рассказывается более подробно. Синхронизация становится проблемой при обновлении имеющихся в файле данных, как это происходит в базах данных.

2. Обычно встречается что-нибудь вроде:

#ifdef REENTRANT

#define errno (*_errno)

#else

extern int errno;

#endif

Если определена константа _REENTRANT, обращение к errno приводит к вызову функции _errno, возвращающей адрес переменной errno вызвавшего потока. Эта переменная, скорее всего, хранится в области собственных данных этого потока (раздел 23.5 [24]). Если константа REENTRANT не определена, переменная errno является глобальной.

Глава 2

1. Эти два бита могут менять действующий идентификатор пользователя и/или группы выполняющейся программы. Идентификаторы используются в разделе 2.4.

2. Сначала следует указать флаги O_CREAT | O_EXCL, и если вызов окажется успешным, будет создан новый объект. Если вызов вернет ошибку EEXIST, объект уже существует и программа должна вызвать open еще раз, без флага O_CREAT или O_EXCL Второй вызов должен оказаться успешным, но есть вероятность, что он вернет ошибку ENOENT, если какой-либо другой поток или процесс удалит объект в промежутке между этими двумя вызовами.

Глава 3

1. Текст пpoгрaммы приведен в листинге Г.1. [1]

Листинг Г.1. Вывод идентификатора и порядкового номера слота

//svmsg/slotseq.c

1 #include "unpipc.h"

2 int

3 main(int argc, char **argv)

4 {

5 int i, msqid;

6 struct msqid_ds info;

7 for (i = 0; i < 10; i++) {

1

Все исходные тексты, опубликованные в этой книге, вы можете найти по адресу http://www.piter.com/download.

8 msqid = Msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT);

9 Msgctl(msqid, IPC_STAT, &info);

10 printf("msqid = %d, seq = %lu\n", msqid, info.msg_perm.seq);

11 Msgctl(msqid, IPC_RMID, NULL);

12 }

13 exit(0);

14 }

2. Первый вызов msgget задействует первую свободную очередь сообщений, порядковый номер которой имеет значение 20 после двукратного запуска программы из листинга 3.2, и вернет идентификатор 1000. Если предположить, что следующая доступная очередь сообщений никогда ранее не использовалась, ее порядковый номер будет иметь значение 0, а возвращаться будет идентификатор 1.

3. Программа приведена в листинге Г.2.

Листинг Г.2. Проверка использования маски создания файла функцией msgget

//svmsg/testumask.c

1 #include "unpipc.h"

2 int

3 main(int argc, char **argv)

4 {

5 Msgget(IPC_PRIVATE, 0666 | IPC_CREAT | IPC_EXCL);

6 unlink("/tmp/fifo.1");

7 Mkfifo("/tmp/fifo.1", 0666);

8 exit(0);

9 }

Запустив эту пpoгрaммy, мы увидим, что маска создания файла имеет значение 2 (снять бит записи для прочих пользователей) и этот бит оказывается снятым для канала FIFO, но не для очереди сообщений:

solaris % umask

02

solaris % testumask

solaris % ls –l /tmp/fifo.1

prw-rw-r-- 1 rstevens other1 0 Mar 25 16:05 /tmp/fifo.1

solaris % ipcs –q

IPC status from <running system> as of Wed Mar 25 16:06:03 1998

T ID KEY MODE OWNER GROUP

Message Queues:

q 200 00000000 –rw-rw-rw– rstevens other1

4. При использовании ftok имеется вероятность того, что для двух полных имен получится один и тот же ключ. При использовании IPC_PRIVATE сервер знает, что он создает новую очередь, но в этом случае ему нужно записать ее идентификатор в какой-либо файл, чтобы клиенты могли его считать.

Поделиться:
Популярные книги

Паразиты

дю Морье Дафна
Проза:
современная проза
6.20
рейтинг книги
Паразиты

Подросток

Достоевский Федор Михайлович
Проза:
русская классическая проза
9.09
рейтинг книги
Подросток

Менталист. Эмансипация

Еслер Андрей
1. Выиграть у времени
Фантастика:
альтернативная история
7.52
рейтинг книги
Менталист. Эмансипация

Третий. Том 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 4

Чиновникъ Особых поручений

Кулаков Алексей Иванович
6. Александр Агренев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чиновникъ Особых поручений

Личный аптекарь императора

Карелин Сергей Витальевич
1. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Личный аптекарь императора

Хозяин Теней 4

Петров Максим Николаевич
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 4

Лекарь Империи 7

Карелин Сергей Витальевич
7. Лекарь Империи
Фантастика:
городское фэнтези
аниме
боевая фантастика
попаданцы
5.00
рейтинг книги
Лекарь Империи 7

Черный Маг Императора 12

Герда Александр
12. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 12

Звездная Кровь. Экзарх III

Рокотов Алексей
3. Экзарх
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Экзарх III

Эволюционер из трущоб. Том 11

Панарин Антон
11. Эволюционер из трущоб
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Эволюционер из трущоб. Том 11

Око василиска

Кас Маркус
2. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Око василиска

Князь Медведев. Дилогия

Вяч Павел
Медведев
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Князь Медведев. Дилогия

"Дальние горизонты. Дух". Компиляция. Книги 1-25

Усманов Хайдарали
Собрание сочинений
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Дальние горизонты. Дух. Компиляция. Книги 1-25