2015-10-05 5 views
1

Я начинаю новую задачу, используя вызов clone(2).Как развернуть процесс Linux в состоянии остановки?

Был флаг CLONE_STOPPED, но он больше не присутствует в текущем ядре.

Есть ли какой-либо трюк, чтобы запустить задачу в состоянии остановки (ожидается, что SIGCONT для фактического запуска)?

+0

Какова Ваша цель в этом? Если это для целей отладки, вы можете использовать 'ptrace' с' PTRACE_O_TRACEFORK' – Hasturkun

+0

Поскольку API, который я реализую, требует, чтобы 'spawn_thread()' порождал поток в состоянии остановки, ожидая 'resume_thread()'. Я не проектировал его - я просто его реализую. – smoku

ответ

1

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

Вы можете увидеть, как ядро ​​v2.6.32 используется, чтобы сделать это в kernel/fork.c (L1449):

if (unlikely(clone_flags & CLONE_STOPPED)) { 
    /* 
    * We'll start up with an immediate SIGSTOP. 
    */ 
    sigaddset(&p->pending.signal, SIGSTOP); 
    set_tsk_thread_flag(p, TIF_SIGPENDING); 
    __set_task_state(p, TASK_STOPPED); 
} else { 
    wake_up_new_task(p, clone_flags); 
} 

Должна быть обеспечена возможность написать функцию обертку в пространстве ядра, чтобы сделать что-то подобное (но, возможно, не тривиальным?).

+0

Ну ... Пересылка этого кода - один из вариантов, который я тоже рассматриваю. Спасибо, что заманил меня за меня. :) – smoku

0

Ребенок может отправить себе SIGSTOP в начале исполняемой fn

+0

Это то, что я до сих пор делал, но это не совсем вопрос. :-) Есть проблемы с другими процессами, участвующими в STOP/CONT, если они изначально запускаются, чтобы остановить себя. – smoku

+0

Также выясняется, что SIGSTOP является обработанным на уровне процесса сигналом, поэтому, когда SIGCONT можно выполнить задачу, SIGSTOP остановит всю группу задач. – smoku

Смежные вопросы