Как инициализировать переменные члена базового класса в производном конструкторе класса?

Почему я не могу сделать это?

class A
{
public:
    int a, b;
};

class B : public A
{
    B() : A(), a(0), b(0)
    {
    }

};
-121--602738- Как узнать, привязан ли какой-либо процесс к сокету домена Unix? Я пишу сервер сокета домена Unix для Linux. Особенность доменных сокетов Unix, которую я быстро выяснил, заключается в том, что при создании прослушивающего сокета Unix создает соответствующую запись файловой системы,...

Я пишу сокетный сервер домена Unix для Linux.

Особенность сокетов домена Unix, которую я быстро выяснил, заключается в том, что при создании прослушивающего сокета Unix создает соответствующую запись файловой системы, закрытие сокета не удаляет его. Кроме того, пока запись файловой системы не будет удалена вручную, невозможно снова привязать () сокет к тому же пути: bind () завершится ошибкой с EADDRINUSE , если указанный путь уже существует в файловой системе.

Следовательно, запись файловой системы сокета должна иметь значение unlink () при завершении работы сервера, чтобы избежать получения EADDRINUSE при перезапуске сервера. Однако это не всегда может быть сделано (т.е. сбой сервера). Большинство часто задаваемых вопросов, сообщений форума, веб-сайтов вопросов и ответов, которые я нашел, советуют в качестве обходного решения только отсоединить () сокет перед вызовом bind () . В этом случае, однако, становится желательным знать, связан ли процесс с этим сокетом, прежде чем разорвать связь () 'с ним.

Действительно, unlink () 'запускает сокет Unix, пока процесс все еще привязан к нему, и затем повторное создание сокета прослушивания не вызывает ошибок. В результате, однако, старый серверный процесс всё ещё выполняется, но недостижим: старый слушающий сокет «маскируется» новым. Такого поведения нужно избегать.

В идеале, используя доменные сокеты Unix, API сокета должен был раскрыть то же поведение "взаимного исключения", которое открывается при привязке сокетов TCP или UDP: " Я хочу привязать сокет S к адресу A; если процесс уже связан с этим адресом, просто пожалуйтесь! "К сожалению, это не так...

Есть ли способ усилить это поведение «взаимного отчуждения»? Или, учитывая путь файловой системы, есть ли способ узнать через API сокета, имеет ли какой-либо процесс в системе сокет домена Unix, привязанный к этому пути? Следует ли использовать примитив синхронизации, внешний по отношению к API сокета ( flock () ,...)? Или я что-то упускаю?

Спасибо за ваши предложения.

Примечание: Абстрактные сокеты Unix пространства имен Linux, похоже, решают эту проблему, поскольку нет записи файловой системы в unlink () . Тем не менее, сервер, который я пишу, должен быть универсальным: он должен быть надежным против обоих типов доменных сокетов Unix, так как я не отвечаю за выбор адресов прослушивания.

34
задан Simon Malinge 13 September 2011 в 17:25
поделиться