Как втиснуть дополнительные параметры в функцию жнеца, когда родитель получает сигнал убить ребенка (с)? - PullRequest
0 голосов
/ 09 декабря 2010

Я пишу TCP-сервер, который работает очень похоже на чат, и наткнулся на этот вопрос.

Когда пользователь подключается, создается дочерний процесс для обслуживания пользователя.
Когда пользователь входит в систему, я сохраняю его имя пользователя в текстовом файле, online.txt
Но когда пользователь выходит из системы, мне нужно удалить пользователя из online.txt (ПРОБЛЕМА), затем родительский элемент signals a reaper() и убить ребенка.

Мои вопросы:

В1: Как я могу втиснуть дополнительную информацию жнецу (например, имя пользователя, которое пользователь использовал для входа), чтобы он также мог удалить пользователя из online.txt? Или есть другой лучший способ сделать это?

Q2: откуда sig в reaper() получает свое значение? Могу ли я добавить дополнительные параметры к жатке?

В3: Могу ли я использовать pid ребенка как своего рода первичный ключ для login.txt? Если так, как я могу получить pid ребенка во время reaper(), который вызывается родителем?

Жнец выглядит так:

void    reaper(int sig)//where does sig come from?
{
int status;

while (waitpid(-1, &status, WNOHANG) >= 0)
    ;
}

Сигнал, используемый родителем, выглядит следующим образом:

(void) signal(SIGCHLD, reaper);//how can I add more parameters?

Заранее спасибо, надеюсь, задавать сразу 3 вопроса не слишком жадно.
Мы будем очень признательны за понимание любых вопросов.

Ответы [ 2 ]

2 голосов
/ 09 декабря 2010

Насколько я понимаю из вашего вопроса, родительский процесс регистрирует reaper () в качестве обработчика для SIGCHLD. Когда он обнаруживает логин, он записывает имя пользователя в файл и порождает ребенка.

При выходе из системы вызывается функция reaper (), потому что дочерний процесс обнаружил, что выход из системы завершен, верно?

Если это так, то почему бы просто не заставить сервер поддерживать структуру данных, отображающую PID в имя пользователя. Затем возьмите возвращаемое значение из waitpid и определите, какое имя пользователя необходимо удалить из файла.

Итак, подведем итог:

1) Нет. Да.

2) Из сигнала, полученного обработчиком. Нет.

3) Да. Из возвращаемого значения waitpid ().

1 голос
/ 09 декабря 2010

Вопрос 1: Подойдет ли настройка обработчика сигнала для вашего дочернего процесса для выполнения какого-либо конкретного действия? Однако, возможно, лучшим решением было бы не использовать файл, а скорее конструкцию в памяти для хранения того, что вошли пользователи. Таким образом, жнец может просто удалить запись из памяти или даже предложенный обработчик сигнала.

Вопрос 2: Я не знаком с вашей ОС или архитектурой, но я предполагаю, что SIGCHLD будет передан в reaper (int sig) для значения параметра.

Вопрос 3: Получение pid зависит от конкретной ситуации. Для типов POSIX это обычно getpid (), из unistd. Однако я хотел бы спросить, действительно ли вы хотите сделать это с файлом.

Ваше решение может стать уязвимым к условиям гонки, когда вы начнете сигнализировать повсюду ... что создает угрозу безопасности.

Другие пользователи, не стесняйтесь меня поправлять. В поисках мудрости нужно принять наставление.

...