C Как обмениваться информацией между процессами? - PullRequest
1 голос
/ 04 июля 2019

Мне нужна помощь с кодом Си. В основном у меня есть n процессы, которые выполняют некоторый код. Когда они будут почти готовы, я бы хотел, чтобы «Процесс менеджера» (который является основной функцией) отправлял каждому из n процессов переменную int, которая может отличаться для каждого процесса. Моя идея состояла в том, чтобы signal(handler_function, SIGALRM) как только все процессы начались. Когда процесс почти завершен, он использует kill(getpid(), SIGSTOP) для ожидания Manager Process. По прошествии SIM_TIME секунд handler_function отправляет переменную int на Message Queue, затем использует kill(process_pid, SIGCONT) для пробуждения ожидающих процессов. Эти процессы после пробуждения должны получить эту переменную int из Message Queue, распечатать ее и просто завершить, позволяя Manager Process снова взять управление на себя.

Вот код:

 /**
 * Child Process creation using fork() system call
 * Parent Process allocates and initializes necessary variables in shared memory
 * Child Process executes Student Process code defined in childProcess function
 */
pid_t runChild(int index, int (*func)(int index))
{
    pid_t pid;
    pid = fork();
    if (pid == -1)
    {
        printf(RED "Fork ERROR!\n" RESET);
        exit(EXIT_FAILURE);
    }
    else if (pid == 0)
    {
        int res = func(index);
        return getpid();
    }
    else
    {
        /*INSIGNIFICANT CODE*/
        currentStudent = createStudent(pid);
        currentStudent->status = FREE;
        students[index] = *currentStudent;
        currentGroup = createGroup(index);
        addMember(currentStudent, currentGroup);
        currentGroup->closed = FALSE;
        groups[index] = *currentGroup;
        return pid;
    }
}

код, выполняемый каждым процессом

 /**
     * Student Process Code
     * Each Student executes this code
     */
    int childProcess(int index)
    {
     /*NOTICE: showing only relevant part of code*/
        printf("Process Index %d has almost done, waiting for manager!\n",          index);
    /* PROGRAM GETS STUCK HERE!*/
    kill(getpid(), SIGSTOP);
    /* mex variable is already defines, it's a struct implementing Message Queue message struct*/
    receiveMessage(mexId, mex, getpid());
    printf(GREEN "Student %d has received variable %d\n" RESET,  getpid(), mex->variable);
}

Функция обработчика:

* Handler function
 * Will be launched when SIM_TIME is reached
 */
void end_handler(int sig)
{
    if (sig == SIGALRM)
    {
        usleep(150000);
        printf(RED "Time's UP!\n" RESET);
        printGroups();
        for(int i = 0; i < POP_SIZE; i++){
            mex->mtype = childPids[i];
            mex->variable = generateInt(18, 30);
            sendMessage(mexId, mex);
            //childPids is an array containing PIDs of all previously launched processes
            kill(childPids[i], SIGCONT);
        }
}

Надеюсь, мой код понятен. У меня есть проблема, хотя, используя предоставленный код, вся программа застревает при системном вызове kill(getpid(), SIGSTOP). Я также попытался запустить ps в терминале, и активные процессы не обнаружены. Я думаю, handler_function по какой-то причине не отправляет kill(childPids[i], SIGCONT) системный вызов. Есть идеи, как решить эту проблему? Спасибо

1 Ответ

0 голосов
/ 04 июля 2019

Возможно, вы захотите начать с чтения справочной страницы по mq_overview (man mq_overview). Он обеспечивает переносимый и гибкий механизм связи между процессами, который позволяет синхронизировать и асинхронно взаимодействовать.

В вашем подходе есть общая проблема «как один процесс узнает, ждет ли другой». Если процесс не остановился сам, SIGCONT игнорируется, и когда он впоследствии приостанавливает себя, никто не будет его продолжать.

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

...