Отправка данных между родителем и потомком с использованием канала в c

использует session.get (*. class, id); но не загружать функцию

0
задан ziberteck 4 March 2019 в 18:20
поделиться

2 ответа

Мне удалось выяснить, как это сделать.

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

int int_pow(int n, int exp){
    int sum = n;
    for (int i = 1; i < exp; i++){
        sum = sum * n;
    }
    return sum;
}

int main()
{
    int random = 0;
    pid_t fpid;
    int p[2]; // 0 = read, 1 = write

    if (pipe(p) < 0){
        exit(1);
    }

    fpid = fork();

    if (fpid == 0){

        printf("\n(Child) Hello from child. \n");
        read(p[0], &random, sizeof(random));
        printf("(Child) Recieved from parent: %d \n", random);
        random = int_pow(random, 2);
        printf("(Child) Sent from child: %d \n", random);
        write(p[1], &random, sizeof(random));

        close(p[0]);//close child read.
        close(p[1]);//close child write.

        exit(0);
    } else {
        //wait(NULL);
        printf("(Parent) Hello from parent. \n");

        random = rand()%100+1;
        printf("(Parent) Sent from parent: %d \n", random);
        write(p[1], &random, sizeof(random));
        sleep(1);
        int wait = read(p[0], &random, sizeof(random));

        close(p[0]);//close parent read.
        close(p[1]);//close parent write.


        printf("(Parent) Recieved from Child: %d \n", random);
        exit(0);
    }
    return 0;
}
0
ответ дан ziberteck 4 March 2019 в 18:20
поделиться

Если вы используете Linux одинаково, просто наберите

man 2 pipe

У вас будет рабочий пример, очень похожий на ваш код. Или перейдите по этой ссылке http://man7.org/linux/man-pages/man2/pipe.2.html .

Сравнивая их, вы можете найти, где у вас возникли недоразумения.

Труба может считываться только один раз, думать о ней как о водопроводной трубе, а не как обычный файл, хотя также использовать файловый дескриптор. Например, в водопроводную трубу вы кладете 1 литр на одном конце, и вы получите только 1 литр на другом конце. Как отмечалось во многих комментариях, прочитанное в родительском файле потребляло 1 литр воды, поэтому у дочернего процесса никогда не было возможности их получить.

0
ответ дан KL-Yang 4 March 2019 в 18:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: