UNIX / Linux: Какие правильные права на каталоги /tmp и /var/tmp
Каковы правильные права доступа, необходимы для каталогов /tmp и /var/tmp?
В каталогах /tmp и /var tmp требуются специальные права доступа.
Этот каталог имеет разрешения Sticky Bit.
Во многих приложениях будут отображаться ошибки или сбои, если они не смогут писать в /tmp с соответствующими разрешениями.
«T» в конце символизирует, что установлен стики бит.
Файл, созданный в каталоге /tmp, может быть удален только его владельцем или пользователем root.
Настройка прав
Измените разрешения для каталога, выполнив следующие команды:
Anything in here will be replaced on browsers that support the canvas element
Проблема с FIFO (именованые каналы)
Re: Проблема с FIFO (именованые каналы)
а сообразить, в каком порядке открывать FIFO, не судьба?
Re: Проблема с FIFO (именованые каналы)
Или fdopen(open(. O_NDELAY))
Re: Проблема с FIFO (именованые каналы)
В p1 перед открытием fifo1 на чтение также открывай его и на запись, но потом этот fd (для записи) не юзаешь.
Re: Проблема с FIFO (именованые каналы)
>а сообразить, в каком порядке открывать FIFO, не судьба?
p1 открывает сначала fifo1 на чтение а потом fifo2 на запись. p2 наоборот сначала fifo1 на запись а потом fifo2 на чтение. Разве такая последовательность не верна?
>В p1 перед открытием fifo1 на чтение также открывай его и на запись, но потом этот fd (для записи) не юзаешь. В p2 наоборот.
Так тоже не получается. При открытии ifname на запись p1 ждет открытия на чтение. Кто знает как открывать два fifo (один на read, другой на write) для взаимодействия двух процессов? Кто работал с фифо?
Re: Проблема с FIFO (именованые каналы)
> а сообразить, в каком порядке открывать FIFO, не судьба?
Порядок был правильный. Проблема оказалась в другом:
был типа процесс-сервер, который сначала создавал одни фифо для запросов клиентов. Потом клиент (p2) посылает запрос (connect) процессу-серверу, после чего p1 делает fork() и уже процесс потомок (p1) открывает два фифо (fifo1 и fifo2) для взаиможействия с p2.
нужна была задержка в клиенте после посылки запроса connect и перед открытием fifo.
>В p1 перед открытием fifo1 на чтение также открывай его и на запись, но потом этот fd (для записи) не юзаешь. В p2 наоборот.
и это тоже применил. Но в другом месте. После вылезла еще проблемка:
Сервер открвает фифо для запросов и ждет открытия на запись. Клиент тоже его открывает. Потом клиент заканчивает работать и закрывает его (и больше никто не открывал его). А серверу надо чтобы этот фифо был кем-нить открыт на запись. Поэтому пришлось открывать и на чтение и на запись (но не писать).
Основы программирования в Linux | Страница 146 | Онлайн-библиотека
1. Сначала попробуйте прочесть (пустой) файл FIFO:
2. Теперь попытайтесь записать в FIFO. Вам придется использовать другой терминал, поскольку первая команда в данный момент «зависла» в ожидании появления каких-нибудь данных в FIFO:
$ echo «Hello World» > /tmp/my_fifo
3. Можно выполнить обе команды одновременно, переведя первую в фоновый режим:
$ echo «Hello World» > /tmp/my_fifo
Как это работает
На третьем шаге процесс cat с самого начала заблокирован в фоновом режиме. Когда echo делает доступными некоторые данные, команда cat читает их и выводит в стандартный вывод. Обратите внимание на то, что она затем завершается, не дожидаясь дополнительных данных. Программа cat не блокируется, т.к. канал уже закрылся, когда завершилась вторая команда, поместившая данные в FIFO, поэтому вызовы read в программе cat вернут 0 байтов, обозначая этим конец файла.
Теперь, когда вы посмотрели, как ведут себя каналы FIFO при обращении к ним с помощью программ командной строки, давайте рассмотрим более подробно программный интерфейс, предоставляющий больше возможностей управления операциями чтения и записи при организации доступа к FIFO.
Открытие FIFO с помощью open
Если вы действительно хотите передавать данные между программами в обоих направлениях, гораздо лучше использовать пару FIFO или неименованных каналов, по одному для каждого направления передачи, или (что нетипично) явно изменить направление потока данных, закрыв и снова открыв канал FIFO. Мы вернемся к двунаправленному обмену данными с помощью каналов FIFO чуть позже в этой главе.
open(const char *path, O_RDONLY);
open(const char *path, O_RDONLY | O_NONBLOCK);
Теперь вызов open завершится успешно и вернет управление сразу, даже если канал FIFO не был открыт для записи каким-либо процессом.
open(const char *path, O_WRONLY);
В данном случае вызов open будет заблокирован до тех пор, пока процесс не откроет тот же канал FIFO для чтения.
open(const char *path, O_WRONLY | O_NONBLOCK);
Выполните упражнение 13.11.
Упражнение 13.11. Открытие файлов FIFO
1. Начните с заголовочных файлов, директивы #define и проверки правильности количества предоставленных аргументов командной строки:
#define FIFO_NAME «/tmp/my_fifo»
int main(int argc, char *argv[]) <
fprintf(stderr, «Usage: %s
O_RDONLY O_WRONLY O_NONBLOCK>\n», *argv);
2. Полагая, что программа передает тестовые данные, вы задаете параметр open_mode из следующих аргументов:
if (strncmp(*++argv, «O_RDONLY», 8) == 0) open_mode |= O_RDONLY;
if (strncmp(*argv, «O_WRONLY», 8) == 0) open_mode |= O_WRONLY;
if (strncmp(*argv, «O_NONBLOCK», 10) == 0) open_mode |= O_NONBLOCK;
3. Далее проверьте, существует ли канал FIFO, и при необходимости создайте его. Затем FIFO открывается, и пока программа засыпает на короткое время, выполняется результирующий вывод. В заключение FIFO закрывается.
res = mkfifo(FIFO_NAME, 0777);
fprintf(stderr, «Gould not create fifo %s\n», FIFO_NAME);
printf(«Process %d opening FIF0\n», getpid());
res = open(FIFO_NAME, open_mode);
printf(«Process %d result %d\n», getpid(), res);
printf(«Process %d finished\n», getpid());
Как это работает
Никогда не уничтожайте FIFO, т.к. у вас нет способа узнать, не использует ли FIFO другая программа.
O_RDONLY и O_WRONLY без O_NONBLOCK
Теперь у вас есть тестовая программа, и вы можете проверить комбинации пар. Обратите внимание на то, что первая программа, считыватель, помещена в фоновый режим.
$ ./fifo2 O_RDONLY &
Process 152 opening FIFO
$ ./fifo2 O_WRONLY
Process 153 opening FIFO
Process 152 result 3
Process 153 result 3
Process 152 finished
Process 153 finished
Когда процесс в ОС Linux заблокирован, он не потребляет ресурсы ЦП, поэтому этот метод синхронизации очень эффективен с точки зрения использования ЦП.
| Нейл Мэтью: Ричард Стоунс: Основы программирования в Linux: 4-е издание | 1 |
| Об авторах | 1 |
| Благодарности | 1 |
| Предисловие | 1 |
| Введение | 1 |
| Для кого эта книга? | 1 |
| Чему посвящена книга? | 2 |
| Что вам потребуется для использования книги? | 2 |
| Исходный программный код | 2 |
| Замечание, касающееся программного кода примеров | 3 |
| Общедоступная лицензия проекта GNU | 3 |
| Стилевое оформление, принятое в книге | 3 |
| Ошибки | 3 |
| Сайт p2p.wrox.com | 3 |
| Глава 1: Приступая к работе | 4 |
| Введение в UNIX, Linux и проект GNU | 4 |
| Что такое ОС UNIX? | 4 |
| Что такое Linux? | 5 |
| Проект GNU и Фонд свободного ПО | 5 |
| Дистрибутивы Linux | 5 |
| Программирование в ОС Linux | 5 |
| Linux-программы | 5 |
| Текстовые редакторы | 6 |
| Компилятор языка С | 6 |
| Маршрутная карта системы разработки | 6 |
| Получение справки | 9 |
| Резюме | 9 |
| Глава 2: Программирование средствами командной оболочки | 9 |
| Почему программа в командной оболочке? | 9 |
| Немного теории | 10 |
| Что такое командная оболочка? | 10 |
| Каналы и перенаправление | 10 |
| Перенаправление вывода | 10 |
| Перенаправление ввода | 11 |
| Каналы | 11 |
| Командная оболочка как язык программирования | 11 |
| Интерактивные программы | 11 |
| Создание сценария | 12 |
| Превращение сценария в исполняемый файл | 12 |
| Синтаксис командной оболочки | 12 |
| Переменные | 12 |
| Условия | 14 |
| Управляющие структуры | 15 |
| Функции | 18 |
| Команды | 18 |
| Выполнение команд | 24 |
| Встроенные документы | 25 |
| Отладка сценариев | 25 |
| По направлению к графическому режиму — утилита dialog | 26 |
| Соединяем все вместе | 27 |
| Требования | 27 |
| Проектирование | 27 |
| Резюме | 29 |
| Глава 3: Работа с файлами | 30 |
| Структура файла в Linux | 30 |
| Каталоги | 30 |
| Файлы и устройства | 30 |
| Системные вызовы и драйверы устройств | 31 |
| Библиотечные функции | 31 |
| Низкоуровневый доступ к файлам | 31 |
| write | 32 |
| read | 32 |
| open | 32 |
| Исходные права доступа | 32 |
| Другие системные вызовы для управления файлами | 34 |
| Стандартная библиотека ввода/вывода | 34 |
| fopen | 35 |
| fread | 35 |
| fwrite | 35 |
| fclose | 35 |
| fflush | 35 |
| fseek | 35 |
| fgetc, getc и getchar | 35 |
| fputc, putc и putchar | 36 |
| fgets и gets | 36 |
| Форматированные ввод и вывод | 36 |
| printf, fprintf и sprintf | 36 |
| scanf, fscanf и sscanf | 37 |
| Другие потоковые функции | 37 |
| Ошибки потока | 38 |
| Потоки и дескрипторы файлов | 38 |
| Ведение файлов и каталогов | 38 |
| chmod | 38 |
| chown | 38 |
| unlink, link и symlink | 38 |
| mkdir и rmdir | 38 |
| chdir и getcwd | 38 |
| Просмотр каталогов | 39 |
| opendir | 39 |
| readdir | 39 |
| telldir | 39 |
| seekdir | 39 |
| closedir | 39 |
| Ошибки | 40 |
| strerror | 40 |
| perror | 40 |
| Файловая система procfs | 40 |
| Более сложные приемы: fcntl и mmap | 41 |
| fcntl | 41 |
| mmap | 41 |
| Резюме | 42 |
| Глава 4: Окружение Linux | 42 |
| Аргументы программы | 42 |
| getopt | 43 |
| getopt_long | 44 |
| Переменные окружения | 44 |
| Применение переменных окружения | 45 |
| Переменная environ | 45 |
| Время и дата | 45 |
| Временные файлы | 47 |
| Информация о пользователе | 48 |
| Информация о компьютере | 49 |
| Ведение системных журналов | 49 |
| Ресурсы и ограничения | 50 |
| Резюме | 52 |
| Глава 5: Терминалы | 52 |
| Чтение с терминала и запись на терминал | 52 |
| Сравнение канонического и неканонического режимов | 53 |
| Обработка перенаправленного вывода | 53 |
| Диалог с терминалом | 53 |
| Драйвер терминала A и общий терминальный интерфейс | 54 |
| Обзор | 54 |
| Аппаратная модель | 54 |
| Структура типа termios | 54 |
| Режимы ввода | 55 |
| Режимы вывода | 55 |
| Режимы управления | 55 |
| Локальные режимы | 55 |
| Специальные управляющие символы | 55 |
| Скорость терминала | 57 |
| Дополнительные функции | 57 |
| Вывод терминала | 58 |
| Тип терминала | 58 |
| Установите тип вашего терминала | 58 |
| Применение характеристик terminfo | 59 |
| Обнаружение нажатий клавиш | 60 |
| Виртуальные консоли | 61 |
| Псевдотерминалы | 61 |
| Резюме | 61 |
| Глава 6: Управление текстовыми экранами с помощью библиотеки curses | 61 |
| Компиляция с библиотекой curses | 61 |
| Терминология библиотеки curses и общие представления | 62 |
| Экран | 63 |
| Вывод на экран | 63 |
| Считывание с экрана | 63 |
| Очистка экрана | 63 |
| Перемещение курсора | 63 |
| Атрибуты символов | 63 |
| Клавиатура | 64 |
| Режимы клавиатуры | 64 |
| Клавиатурный ввод | 64 |
| Окна | 65 |
| Структура WINDOW | 65 |
| Универсальные функции | 65 |
| Перемещение и обновление окна | 65 |
| Оптимизация обновлений экрана | 66 |
| Вложенные окна | 66 |
| Дополнительная клавиатура | 67 |
| Применение цвета | 67 |
| Переопределение цветов | 68 |
| Панели | 68 |
| Приложение, управляющее коллекцией компакт-дисков | 68 |
| Начало нового приложения для работы с коллекцией компакт-дисков | 69 |
| Взгляд на функцию main | 69 |
| Формирование меню | 69 |
| Управление базой данных | 69 |
| Запросы к базе данных компакт-дисков | 70 |
| Резюме | 71 |
| Глава 7: Управление данными | 71 |
| Управляемая память | 71 |
| Простое выделение памяти | 71 |
| Выделение огромных объемов памяти | 72 |
| Неправильное обращение к памяти | 73 |
| Указатель null | 73 |
| Освобождение памяти | 73 |
| Другие функции распределения памяти | 73 |
| Блокировка файлов | 74 |
| Создание файлов с блокировкой | 74 |
| Блокировка участков файла | 75 |
| Применение вызовов read и write при наличии блокировки | 76 |
| Конкурирующие блокировки | 77 |
| Другие команды блокировок | 78 |
| Взаимоблокировки | 78 |
| Базы данных | 78 |
| База данных dbm | 78 |
| Подпрограммы dbm | 79 |
| Функции доступа dbm | 79 |
| Дополнительные функции dbm | 80 |
| Приложение для работы с коллекцией компакт-дисков | 81 |
| Обновление проектного решения | 81 |
| Приложение управления базой данных компакт-дисков, использующее dbm | 81 |
| Резюме | 85 |
| Глава 8: MySQL | 85 |
| Установка | 85 |
| Пакеты MySQL | 85 |
| Настройка после установки | 85 |
| Устранение неисправностей после установки | 87 |
| Администрирование MySQL | 87 |
| Команды | 87 |
| Создание пользователей и наделение их правами доступа | 89 |
| Пароли | 90 |
| Создание базы данных | 90 |
| Типы данных | 90 |
| Создание таблицы | 91 |
| Графические средства | 91 |
| Доступ к данным MySQL из программ на С | 92 |
| Подпрограммы подключения | 92 |
| Обработка ошибок | 93 |
| Выполнение SQL-операторов | 93 |
| Разные функции | 97 |
| Приложение для работы с базой данных компакт-дисков | 97 |
| Создание таблиц | 98 |
| Вставка данных | 98 |
| Доступ к данным приложения из программы на С | 99 |
| Резюме | 101 |
| Глава 9: Средства разработки | 101 |
| Проблемы применения многочисленных исходных файлов | 101 |
| Команда make и make-файлы | 101 |
| Синтаксис make-файлов | 101 |
| Опции и параметры make | 101 |
| Комментарии в make-файле | 102 |
| Макросы в make-файле | 102 |
| Множественные задания | 103 |
| Встроенные правила | 104 |
| Суффиксы и шаблоны правил | 104 |
| Управление библиотеками с помощью make | 104 |
| Более сложная тема: make-файлы и подкаталоги | 105 |
| Версия GNU команд make и gcc | 105 |
| Управление исходным кодом | 106 |
| RCS | 106 |
| SCCS | 107 |
| Сравнение RCS и SCCS | 107 |
| CVS | 107 |
| Subversion | 109 |
| Написание интерактивного справочного руководства | 109 |
| Распространение программного обеспечения | 110 |
| Программа patch | 110 |
| Другие утилиты распространения | 111 |
| RPM-пакеты | 111 |
| Работа с файлами RPM-пакетов | 111 |
| Установка RPM-пакетов | 112 |
| Формирование RPM-пакетов | 112 |
| Пакеты других форматов | 114 |
| Среды разработки | 114 |
| KDevelop | 114 |
| Другие среды разработки | 114 |
| Резюме | 114 |
| Глава 10: Отладка | 115 |
| Типы ошибок | 115 |
| Общие методы отладки | 115 |
| Программа с ошибками | 115 |
| Анализ кода | 116 |
| Оснащение средствами контроля | 116 |
| Контролируемое выполнение | 117 |
| Отладка с помощью gdb | 117 |
| Запуск gdb | 117 |
| Выполнение программы | 117 |
| Трассировка стека | 118 |
| Просмотр переменных | 118 |
| Вывод листинга программы | 118 |
| Установка точек останова | 118 |
| Вставка исправлений с помощью отладчика | 119 |
| Дополнительные сведения о gdb | 119 |
| Дополнительные средства отладки | 120 |
| Lint удаление ошибок из ваших программ | 120 |
| Средства, отслеживающие вызовы функций | 121 |
| Выполнение профилирования с помощью prof/gprof | 121 |
| Проверки соблюдения условий | 121 |
| Устранение ошибок использования памяти | 122 |
| ElectricFence | 122 |
| valgrind | 122 |
| Резюме | 123 |
| Глава 11: Процессы и сигналы | 123 |
| Что такое процесс? | 123 |
| Структура процесса | 124 |
| Таблица процессов | 124 |
| Просмотр процессов | 124 |
| Системные процессы | 125 |
| Планирование процессов | 125 |
| Запуск новых процессов | 126 |
| Замена образа процесса | 126 |
| Дублирование образа процесса | 127 |
| Ожидание процесса | 127 |
| Процессы-зомби | 128 |
| Перенаправление ввода и вывода | 128 |
| Потоки | 129 |
| Сигналы | 129 |
| Отправка сигналов | 130 |
| Множества сигналов | 131 |
| Резюме | 133 |
| Глава 12: Потоки POSIX | 133 |
| Что такое поток? | 133 |
| Достоинства и недостатки потоков | 134 |
| Первая программа с применением потоков | 134 |
| Одновременное выполнение | 135 |
| Синхронизация | 136 |
| Синхронизация с помощью семафоров | 136 |
| Синхронизация с помощью мьютексов | 137 |
| Атрибуты потока | 138 |
| Атрибуты планирования потока | 139 |
| Отмена потока | 139 |
| Потоки в изобилии | 140 |
| Резюме | 141 |
| Глава 13: Связь между процессами: каналы | 141 |
| Что такое канал? | 141 |
| Каналы процессов | 141 |
| popen | 141 |
| pclose | 142 |
| Отправка вывода в popen | 142 |
| Передача данных большого объема | 142 |
| Как реализован вызов popen | 142 |
| Вызов pipe | 143 |
| Родительский и дочерний процессы | 144 |
| Чтение закрытых каналов | 144 |
| Каналы, применяемые как стандартные ввод и вывод | 144 |
| Именованные каналы: FIFO | 145 |
| Доступ к FIFO | 145 |
| Более сложная тема: применение каналов FIFO в клиент-серверных приложениях | 147 |
| Приложение для работы с базой данных компакт-дисков | 148 |
| Цели | 149 |
| Реализация | 149 |
| Функции интерфейса клиента | 150 |
| Интерфейс сервера server.c | 151 |
| Канал | 151 |
| Резюме, касающееся приложения | 152 |
| Резюме | 153 |
| Глава 14: Семафоры, совместно используемая память и очереди сообщений | 153 |
| Семафоры | 153 |
| Описание семафора | 153 |
| Теоретический пример | 154 |
| Реализация семафоров в Linux | 154 |
| Применение семафоров | 155 |
| Совместно используемая память | 156 |
| shmget | 156 |
| shmat | 156 |
| shmdt | 156 |
| shmctl | 156 |
| Очереди сообщений | 157 |
| msgget | 158 |
| msgsnd | 158 |
| msgrcv | 158 |
| msgctl | 158 |
| Приложение для работы с базой данных компакт-дисков | 159 |
| Пересмотр функций сервера | 159 |
| Пересмотр функций клиента | 160 |
| Команды состояния IPC | 160 |
| Отображение состояния семафора | 160 |
| Отображение состояния совместно используемой памяти | 160 |
| Отображение состояния очереди сообщений | 160 |
| Резюме | 160 |
| Глава 15: Сокеты | 160 |
| Что такое сокет? | 161 |
| Соединения на базе сокетов | 161 |
| Атрибуты сокета | 162 |
| Создание сокета | 163 |
| Адреса сокетов | 163 |
| Именование сокета | 163 |
| Создание очереди сокетов | 164 |
| Прием запросов на соединение | 164 |
| Запросы соединений | 164 |
| Закрытие сокета | 164 |
| Обмен данными с помощью сокетов | 164 |
| Порядок байтов на компьютере и в сети | 165 |
| Сетевая информация | 166 |
| Интернет-демон (xinetd/inetd) | 167 |
| Параметры сокета | 167 |
| Множественные клиенты | 168 |
| select | 168 |
| Множественные клиенты | 169 |
| Дейтаграммы | 170 |
| Резюме | 171 |
| Глава 16: Программирование в GNOME с помощью GTK+ | 171 |
| Введение в систему X | 171 |
| X-сервер | 171 |
| X-клиент | 172 |
| X-протокол | 172 |
| Xlib | 172 |
| Комплекты инструментов | 172 |
| Оконные менеджеры | 172 |
| Другие способы создания GUI — платформно-независимые оконные API | 172 |
| Введение в GTK+ | 172 |
| Система типов GLib | 173 |
| Система объектов GTK+ | 173 |
| Знакомство с GNOME | 173 |
| Установка библиотек разработки GNOME/GTK+ | 173 |
| События, сигналы и обратные вызовы | 174 |
| Виджеты упаковочных контейнеров | 175 |
| Виджеты GTK+ | 176 |
| GtkWindow | 176 |
| GtkEntry | 176 |
| GtkSpinButton | 177 |
| GtkButton | 177 |
| GtkTreeView | 178 |
| Виджеты GNOME | 179 |
| Меню GNOME | 179 |
| Диалоговые окна | 180 |
| GtkDialog | 180 |
| Модальное диалоговое окно | 181 |
| Немодальные диалоговые окна | 181 |
| GtkMessageDialog | 181 |
| Приложение для работы с базой данных компакт-дисков | 182 |
| Резюме | 184 |
| Глава 17: Программирование в KDE с помощью Qt | 184 |
| Введение в KDE и Qt | 184 |
| Установка Qt | 184 |
| Сигналы и слоты | 185 |
| Виджеты Qt | 187 |
| QLineEdit | 187 |
| Кнопки Qt | 188 |
| QComboBox | 189 |
| QListView | 190 |
| Диалоговые окна | 190 |
| QDialog | 190 |
| QMessageBox | 191 |
| QInputDialog | 191 |
| Применение qmake для упрощения написания make-файлов | 192 |
| Создание меню и панелей инструментов с помощью KDE | 192 |
| Приложение для работы с базой данных компакт-дисков с использованием KDE/Qt | 193 |
| MainWindow | 193 |
| AddCdDialog | 193 |
| LogonDialog | 193 |
| main.cpp | 194 |
| Резюме | 194 |
| Глава 18: Стандарты Linux | 194 |
| Язык программирования С | 194 |
| Краткий урок истории | 195 |
| Коллекция компиляторов GNU | 195 |
| Опции gcc | 195 |
| Интерфейсы и Linux Standards Base | 196 |
| Стандартные библиотеки LSB | 196 |
| Применение стандарта LSB к библиотекам | 197 |
| Инициализация системы LSB | 197 |
| Стандарт устройства файловой системы | 197 |
| Что еще почитать о стандартах? | 199 |
| Резюме | 199 |











