Передача значения в обработчик дочернего процесса - PullRequest
0 голосов
/ 22 марта 2019

Допустим, я создаю через форк дочерний процесс из родительского процесса и передаю значение X дочернему процессу с помощью канала. Сначала дочерний процесс находится в состоянии паузы, и я запускаю его с помощью сигнала SIGINT. Что я хочу сделать? это передать значение X обработчику сигнала, используемому в pipe. Кроме того, значение i изменится во время работы родительского процесса, и мне придется передавать его несколько раз, поэтому я не думаю, что глобализация будет работать. Код:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>


void handler() {
    //i would like to print the value of i here.
}

int main() {
    int fd[2], s;
    pipe(fd);
    pid_t c = fork();

    if (c == 0) {
        signal(SIGINT, handler);
        pause();
        read(fd[0], &s, sizeof(s));
        //if use printf("%d",s) here s=2 correctly.
    }
    if (c > 0) {
        int i = 2;
        sleep(1);               //i don't want the SIGINT signal to terminate the child process so i wait for it to reach pause
        kill(c, SIGINT);
        write(fd[1], &i, sizeof(i));
    }
}

Как это можно сделать?

1 Ответ

1 голос
/ 22 марта 2019

Добавьте глобальную переменную со значением 0 в начале дочернего элемента. Поместите цикл времени в ребенка. Когда поступит сигнал, установите его в 1. В цикле while проверьте значение глобальной переменной, если она обращается в единицу, если это так, прочитайте и распечатайте и верните переменную обратно в 0.

Пример

#include <stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
#include <sys/wait.h>


int signal_received = 0;

void handler(){
    signal_received = 1;
}

int main(){
int fd[2],s;
pipe(fd);
pid_t c=fork();

if(c==0){
    signal(SIGINT,handler);
    while (1)
    {
        if (signal_received)
        {
            read(fd[0],&s,sizeof(s));
            printf("%d",s);
            signal_received = 0;
        }
    }
    pause();
    read(fd[0],&s,sizeof(s));
 //if use printf("%d",s) here s=2 correctly.
 }
if(c>0){
int i=2;
sleep(1);//i don't want the SIGINT signal to terminate the child process so i wait for it to reach pause
kill(c,SIGINT);
write(fd[1],&i,sizeof(i));
}
}

Конечно, это заглушка на то, что вы хотите, есть еще.

Вы можете добавить параллельную защиту для глобальной переменной.

Если у вас более сложная система, то лучше подойдет очередь сообщений.

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...