В этом примере: паттерн безопасной разработки, предусматривающий разделение "сетевых" и "файловых" информационных потоков.
Рассмотрим программу Client
, использующую файловые системы и сокеты Беркли. Для обработки ее вызовов мы запустим не один, а два отдельных VFS-процесса из исполняемых файлов VfsFirst
и VfsSecond
. Через переменные окружения мы зададим файловые бэкенды как работающие через канал до VfsFirst
, а сетевые бэкенды – как работающие через канал до VfsSecond
. Будем использовать стандартные бэкенды client и server. Благодаря этому мы перенаправим "файловые вызовы" Client
в VfsFirst
, а "сетевые" – в VfsSecond
. Чтобы передать процессам переменные окружения, добавим в решение программу Env
.
Init-описание решения представлено ниже. Процесс Client
будет соединен с процессами VfsFirst
и VfsSecond
, при этом каждый из трех процессов соединен с процессом Env
. Обратите внимание, что имя IPC-канала до процесса Env
задается с помощью переменной ENV_SERVICE_NAME
.
init.yaml
entities:
- name: Env
- name: Client
connections:
- target: Env
id: {var: ENV_SERVICE_NAME, include: env/env.h}
- target: VfsFirst
id: VFS1
- target: VfsSecond
id: VFS2
- name: VfsFirst
connections:
- target: Env
id: {var: ENV_SERVICE_NAME, include: env/env.h}
- name: VfsSecond
connections:
- target: Env
id: {var: ENV_SERVICE_NAME, include: env/env.h}
Чтобы направить все "файловые" вызовы в VfsFirst
, зададим значение переменной окружения _VFS_FILESYSTEM_BACKEND
следующим образом:
VfsFirst
: _VFS_FILESYSTEM_BACKEND=server:<имя IPC-канала до VfsFirst>
;Client
: _VFS_FILESYSTEM_BACKEND=client:<имя IPC-канала до VfsFirst>
.Для направления "сетевых" вызовов в VfsSecond
используем аналогичную переменную окружения _VFS_NETWORK_BACKEND
:
VfsSecond
зададим: _VFS_NETWORK_BACKEND=server:<имя IPC-канала до VfsSecond>
;Client
: _VFS_NETWORK_BACKEND=client:<имя IPC-канала до VfsSecond>
.Значение переменных окружения зададим через программу Env
, код которой представлен ниже.
env.c
#include <env/env.h>
#include <stdlib.h>
int main(void)
{
const char* vfs_first_envs[] = { "_VFS_FILESYSTEM_BACKEND=server:VFS1" };
ENV_REGISTER_VARS("VfsFirst", vfs_first_envs);
const char* vfs_second_envs[] = { "_VFS_NETWORK_BACKEND=server:VFS2" };
ENV_REGISTER_VARS("VfsSecond", vfs_second_envs);
const char* client_envs[] = { "_VFS_FILESYSTEM_BACKEND=client:VFS1", "_VFS_NETWORK_BACKEND=client:VFS2" };
ENV_REGISTER_VARS("Client", client_envs);
envServerRun();
return EXIT_SUCCESS;
}
В начало