Пытаюсь написать программу ,которая управляет некоторым количеством процессов и следит за ними,а конкретно,если убиваем процесс,то возобновляем его.Не понимаю почему всегда срабатывает обработчик signal_handler,хотя даже не убиваю сигнал.
#include <iostream>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <csignal>
#include "process.h"
using namespace std;
int N=0;
void signal_handler(int signal)//обработчик сигнала
{
if (signal==SIGCHLD)
{
cout<<"SIGCHLD received"<<endl;
}
}
void Create_Processes()//функция создания процессов
{
cout<<"Create Process "<<endl;
cout<<"Input count of processes"<<endl;
cin>>N;
pid.resize(N);
my_pid.resize(N);
my_pa_pid.resize(N);
for (int i=1;i<=N;i++)
{
pid[i]=fork();
my_pid[i]=getpid();
my_pa_pid[i]=getppid();
if (pid[i]==-1) cout <<"Error"<<endl;
else if (pid[i]==0)
{
//children
//for(;;);
cout<<"pid["<<i<<"]="<<"(CHILDREN) I am Children! and my pid is "<<my_pid[i]<<" and my parent pid is "<<my_pa_pid[i]<<endl;
}
else {
//parent
cout<<"pid["<<i<<"]="<<" (PARENT) I am main process and my pid is "<<my_pid[i]<<" My process child "<<pid[i]<<endl;
int child_status=0;
signal(SIGCHLD,signal_handler);
for (;;)
{
pid[i]=waitpid(-1, &child_status, WNOHANG);
if (pid[i]>0)
{
pid[i]=fork();
cout<<"Resart process with pid "<<getpid()<<endl;
break;
}
pause();
}
}
}
int main() {
Create_Processes();
введите сюда код
return 0;
}
Не понимаю почему всегда срабатывает обработчик signal_handler,хотя даже не убиваю сигнал.
Сигнал SIGCHLD посылается родительскому процессу в тот момент, когда дочерний завершается. По любой причине - завершается. В частности, если дочерний процесс достиг } самого внешнего блока. Посмотрите на оператор if который определяет поведение дочернего процесса:
if (pid[i]==0) {
cout<<"pid["<<i<<"]="<<"(CHILDREN) I am Children! and my pid is <<my_pid[i]<<" and my parent pid is "<<my_pa_pid[i]<<endl;
}
Т.е. дочерний процесс печатает сообщение и завершается. Родительскому, соответственно, посылается сигнал. Что Вас не устраивает ? То, что Вы не убиваете дочерние процессы? Так Вы просто не успеваете это сделать - они сами завершаются мгновенно.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Всем привет, дошел до темы указателей, честно говоря, тема неприятная, поэтому сразу к вам вопросы, товарищи
Использую библиотеку dwrite для рендера текста в Direct2DТекст хорошо рисуется, проблем никаких нет
Можно ли подключить в Qt creatorh файлы,написанные на c++ в vs2015,и использовать их функционал?