Управление процессами C++ Linux

281
15 ноября 2017, 01:28

Пытаюсь написать программу ,которая управляет некоторым количеством процессов и следит за ними,а конкретно,если убиваем процесс,то возобновляем его.Не понимаю почему всегда срабатывает обработчик 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;
    }  
Answer 1

Не понимаю почему всегда срабатывает обработчик 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;
}

Т.е. дочерний процесс печатает сообщение и завершается. Родительскому, соответственно, посылается сигнал. Что Вас не устраивает ? То, что Вы не убиваете дочерние процессы? Так Вы просто не успеваете это сделать - они сами завершаются мгновенно.

READ ALSO
Помощь с указателями

Помощь с указателями

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

238
Расчет RECT занимаемый текстом

Расчет RECT занимаемый текстом

Использую библиотеку dwrite для рендера текста в Direct2DТекст хорошо рисуется, проблем никаких нет

191
Подключение сторонних файлов в Qt creator

Подключение сторонних файлов в Qt creator

Можно ли подключить в Qt creatorh файлы,написанные на c++ в vs2015,и использовать их функционал?

262