LINUX.ORG.RU

Есть ли функция показывающас новый процесс?

 , ,


0

2

Вот например функция, которая выводит список запущенных процессов, это в модуле ядра.

ssize_t scull_read ( struct file *file, char __user *buf, size_t count, loff_t *pos)
{
        char data[8192];
        char *p, *h;
        p = &data[0];

        struct task_struct *task;
        int i = 0;
        int len = 0;
        int ret;



        for_each_process(task) 
        {
                h = &task->comm[0];
                while ( *h != 0 )
                {
                        *p = *h;
                        p++;
                        h++;
                        len++;
                }
                *p = 32;
                p++;
                p++;
                len++;
                if ( len > 8190 ) break;
        }

        copy_to_user ( buf, data, len ); 
        return len;
}
Это например выводит список процессов. А есть функция, которая оповещает о новом процессе?

p = &data[0];

char data[8192];

h = &task->comm[0];

if ( len > 8190 ) break;

*p = 32;

Рано ты в ядро полез.

По сабжу — можно с помощью LSM или kprobe. Но для начала лучше ответить на вопрос «зачем». Так зачем?

Deleted ()
Последнее исправление: Deleted (всего исправлений: 1)

Хук на fork/execve?

anonymous ()
Ответ на: комментарий от Deleted

Почему же рано? Я функций ядра мало знаю.

                h = &task->comm[0];
                while ( *h != 0 )
                {
                        *p = *h;
                        p++;
                        h++;
                        len++;
                }
                *p = 32;
                p++;
                p++;
                len++;
                if ( len > 8190 ) break;
Зато не выйдет за границу массива и скопирует названия процессов.

Так зачем?

Интересно очень.

Рано ты в ядро полез.

А как по твоему лучше написать?

u0atgKIRznY5 ()
Ответ на: комментарий от Deleted

И как использовать kprobe, чтобы узнать о появлении нового процесса?

u0atgKIRznY5 ()
Ответ на: комментарий от u0atgKIRznY5

Почему же рано?

Потому что нельзя использовать магию вне Хогвартса.

А как по твоему лучше написать?

Полистай код ядра и подумай, чем он отличается от твоего.

И как использовать kprobe, чтобы узнать о появлении нового процесса?

less linux/Documentation/kprobes.txt

Deleted ()
Ответ на: комментарий от Deleted

Полистай код ядра и подумай, чем он отличается от твоего.

Вот видишь, сам незнаешь как лучше написать и даёшь совет. А там между прочим побайтно всё равно данные копируются. Не обращаясь к другим функция, это быстрый метод копирования неопределённого количества байт.

u0atgKIRznY5 ()
Ответ на: комментарий от u0atgKIRznY5

Видимо, намёков ты не понимаешь, поэтому нужно писать прямо.

Твой код ужасен. Он плох настолько, что проще не указывать на места, которые сделаны неправильно, а перечислить места, которые сделаны правильно. И это только одна функция.

Плохой код — это проблема с кодом, а не с тобой. А вот то, что ты не желаешь вникать в советы, которые тебе дают — уже проблема с тобой.

i-rinat ★★★★★ ()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от i-rinat

А по теме или по вопросу, вместо того чтобы разглагольствовать напишите код, который по вашим меркам «лучший». Так я наглядно увижу что до как.

u0atgKIRznY5 ()
Ответ на: комментарий от anonymous

Не значит что хороших))

В секцию с ARM-кодом не нужно просто смотреть.

Ну ладно, про стек просто из кода не узнаешь. Но локи-то видно. Они же везде есть, где for_each_process() используется.

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

Твой код ужасен. Он плох настолько, что проще не указывать на места, которые сделаны неправильно, а перечислить места, которые сделаны правильно. И это только одна функция.

Плохой код — это проблема с кодом, а не с тобой. А вот то, что ты не желаешь вникать в советы, которые тебе дают — уже проблема с тобой.

Вот уже всю последнюю неделю вы носитесь с ТСом как с писаной торбой, и помогаете, с подсказываете и вообще делаете все что угодно, а в ответ вот что-то вроде такого:

А по теме или по вопросу, вместо того чтобы разглагольствовать напишите код, который по вашим меркам «лучший»

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

Kronick ()
Ответ на: комментарий от Kronick

неужто прямо нравится растрачивать силы и время

Не знаю, как у других, но у меня всё равно не получается прямо весь день делом заниматься. Сколько-то времени в день всё равно занимает тупняк. Так что разницы особой нет.

Вот если это много времени занимает, то да, проблема.

i-rinat ★★★★★ ()
Ответ на: комментарий от u0atgKIRznY5

Наверное имеется ввиду это?

Один из моментов, да.

i-rinat ★★★★★ ()

А есть ещё способы узнать какой новый процесс появился?

u0atgKIRznY5 ()
Ответ на: комментарий от i-rinat

А про локи ты ему специально не написал?

Локи? Это что? Заблокировать доступ, типа семафора, только lock? Чтобы сначала одному процессу передать текст, потом другому?

u0atgKIRznY5 ()
Ответ на: комментарий от i-rinat

Что ты можешь о них рассказать и где и в какой книжке может быть есть об этом информация? Как их использовать?

u0atgKIRznY5 ()
Ответ на: комментарий от i-rinat

А то у тебя мало полезных проектов, помимо основной работы.
«Лучший отдых - смена вида деятельности»
«Землю попашет - попишет стихи»

ABW ★★★★★ ()

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

anonymous ()
Ответ на: комментарий от u0atgKIRznY5

В ядре стек всего на 1 страницу, 4 килобайта. В LDD 3 об этом написано. В других книжках по ядру наверное тоже

Harald ★★★★★ ()
Ответ на: комментарий от u0atgKIRznY5

Да, «типа семафора». Код, захвативший мьютекс (сделавший лок) выполняется, когда другие пытаются захватить тот же объект — им приходится ждать. Так защищают ресурсы от конкурентного изменения. Подумай: ведь будет очень плохо, если одни и те же данные смогут менять в разных потоках/процессах, или если их будут читать, когда в них кто-то пишет.

evilface ★★ ()
Ответ на: комментарий от Harald

вылезай из криокамеры

For most of the history of Linux, on most architectures, the kernel stack has been put into an 8KB allocation — two physical pages. As recently as 2008 some developers were trying to shrink the stack to 4KB, but that effort eventually proved to be unrealistic.

https://lwn.net/Articles/600644/

anonymous ()
Ответ на: комментарий от pftBest

Ну я вот думаю что pos нужна для того, чтобы при следующем считывании можно было продолжить получать данные далее по списку. Но так то да, надо разбираться. Там ещё и в struct file тоже есть pos.

u0atgKIRznY5 ()
Ответ на: комментарий от pftBest

Или например с помощью pos можно выдавать позицию данных прибавляя указатель на велечину pos.

u0atgKIRznY5 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.