Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Работа с процессами в ЮНИКС

Автор: zam
Дата сообщения: 13.11.2003 03:29
как определить (программно - на си) максимальное число создаваемых в системе процессов? я попробовал, но у меня линукс завис, inetd не мог никакому процессу послать 9й сигнал (SIGKILL).

второй вопрос -- вобще не знаю, как делать? Вот задание:
Написать программу trykill которая на практике определяет множество сигналов,
- которыми могут обмениваться 2 процесса одного пользователя;
- которые могут быть посланы процессом пользователя A процессу пользователя B, при условии, что пользователи A и B являются членами одной группы;
- которые могут быть посланы процессом пользователя A процессу пользователя root.

Кто в курсе как это сделать -- напишите плисс код, (или хотя бы идею). Спасибо.

Автор: f_serg
Дата сообщения: 13.11.2003 08:23
zam

Цитата:
как определить (программно - на си) максимальное число создаваемых в системе процессов?


man getrlimit, параметр RLIMIT_NPROC


Цитата:
Написать программу trykill которая на практике определяет множество сигналов,


Только идея. Количество синалов в системе NSIG (константа в signal.h). Пишешь один процесс, который перехватывает все сигналы, и другой, который их посылает. По результату, возвращаемому kill(pid, sig), определяешь множество сигналов.
Да, не забывай,

Цитата:
The signals SIGKILL and SIGSTOP cannot be caught or ignored
.
С этими двумя сигналами как-нибудь отдельно решай вопрос.
Во всяком случае посылай SIGSTOP до SIGCONT.
Автор: gnu
Дата сообщения: 13.11.2003 14:57
f_serg
по поводу первого: а как вычислить эту константу, но в лоб? т.е. я вызывал в цикле форк, каждый раз сравнивал в родителе пид только что созданного процесса с первым созданным процессом (из этой же программы), ставил условие, что как только эти пиды будут равны, выйти из цикла. Но программа не корректно работала. Хотелось бы именно созданием процессов определить эту константу...

так кстати наверное и через sysconf(XXX) где xxx необходимая константа, можно получить количество допустимых процессов. Но такие способы скучны, хотя и правильны.

по поводу 2. сейчас займусь
Автор: f_serg
Дата сообщения: 13.11.2003 17:17
gnu

Цитата:
что как только эти пиды будут равны, выйти из цикла.

Не уверен, что это правильно. Как ситема раздает пиды? Я точно не знаю. Опять же, этот пид может занять сторонний процесс.
Автор: gnu
Дата сообщения: 17.11.2003 03:21
f_serg
1. была задача определить время переключения между контекстами двух процессов. своей программой определил: получилось 0, 147680 мкс (athlon 2500+, linux-2.4.21). Как я делал:
Создаю два программных канала (a и b) и порождаю один процесс A, которй в бесконечном цикле, синхронизируясь с родительским, обменивается порциями данных в 1 байт через каналы. Процесс A осуществляет запись в канал a и ожидает получения данных из канала b (родитель), процесс B осуществляет запись в канал b и ожидать получения данных из канала a. Нехитрым способом (засекаю время между отправкой байт родителем и получением байт им же), делю на 2 (2 переключения), вычитаю время работы write * 4 и получаю ответ. От конечно приближенный.

Ты знаешь еще способы определить время переключения между контекстами процессов? Нужно придумать что-то надежнее.

2. вернусь к первой задаче ( программа осуществляет порождение нескольких процессов, запуск ими некоторой программы, и ожидание их завершения. и в этом контексте (т.е. при помощи этой программы) определить M - максимально возможное число процессов для данной реализации. Что я делал (в лоб)


Код:
int main(int argc, char **argv)
{
long i;
pid_t pid1, pid2;
pid1 = fork();
if(pid1==0)
exit(0);

for(i=0;i<100000;i++)
{
pid2 = fork();
if( (pid2 = fork()) == 0)
{
exit(0);
}

if(pid2==pid1)
break;
}

printf("NUMBER of maximum processes: %ld\n", i);
return 0;
}
Автор: f_serg
Дата сообщения: 17.11.2003 07:39
gnu

Цитата:
Ты знаешь еще способы определить время переключения между контекстами процессов?

Нет. Искать надо.

Цитата:
for(i=0;i<100000;i++)
{
pid2 = fork();
if( (pid2 = fork()) == 0)
{
exit(0);
}

Ну, во-первых pid2 = fork() два раза подряд. Что-то тут неправильно. И ты бы делал printf("%u\n", pid2). Хоть посмотреть можно, как там пиды присваиваются.

Цитата:
ведь мы же не знаем, какие именно сигналы поддерживаются данной реализацией?

Да все мы знаем.
Что-то типа

Код: void sig_handler(int sig)
{
printf("cathed signal %d\n", sig);
}
...
int i;
for (i = 1; i < NSIG; i++)
signal(i, sig_handler)
Автор: gnu
Дата сообщения: 27.11.2003 08:35

Код: Написать программу trykill которая на практике определяет множество сигналов,
- которыми могут обмениваться 2 процесса одного пользователя; (*)
- которые могут быть посланы процессом пользователя A процессу пользователя B, при условии, что пользователи A и B являются членами одной группы; (**)
- которые могут быть посланы процессом пользователя A процессу пользователя root. (***)
Автор: f_serg
Дата сообщения: 27.11.2003 15:45
gnu

Цитата:
Прально???

Теоретически, да! Для (***)
На практике попробуешь, нипиши, прально или нет.
А для (*) тебе надо два процесса, один ловит сигналы

Код: void sig_handler(int sig)
{
printf("catched signal %d\n", sig);
}

Страницы: 1

Предыдущая тема: Consol-ные задачки на Delphi...


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.