Создание трубы через функции - PullRequest
0 голосов
/ 24 сентября 2018

Мне было интересно, может ли кто-нибудь помочь мне изменить мой текущий код ....

В настоящее время он создает мой процесс с помощью fork () и получает указатель на функцию, которая выполняет этот блок дочернего кода.

Я хотел поиграть с каналами и попытаться теперь заставить Процесс Y отправить свой pid в Процесс X, а затем я хочу отправить его обратно в Main ...

Вот что у меня естьв настоящее время

#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <stdlib.h> // exit
#include <fcntl.h>
#include <sys/wait.h>
void processX();
void processY();

pid_t addChild(void (*childPtr) (), int fileDes[2]) {
    pid_t cpid;
    if((cpid=fork()) == 0) {
        pipe(fileDes);
        childPtr(fileDes);
        wait(NULL);
        exit(0);
    } else if (cpid < 0) {
        printf("failed to fork");
        exit(1);
    } else {

    }
    return cpid;
}

void processY(int fileDes[2]) {
    printf("Child Y[%d] Created of Parent X[%d]\n", getpid(), getppid());
    printf("We are now going to write Y PID to process X\n");
    pid_t a = getpid();
    char buf[1024]; // child reads from pipe() to buffer
    close(fileDes[0]); // close reading end of the pipe
    write(fileDes[1], &a, sizeof(buf) / sizeof(int));

}

void processX(int fileDes[2]) {
    printf("Child X[%d] Created of parent Main[%d]\n", getpid(), getppid());
    int status;

    pid_t Y = addChild(processY, fileDes);
    wait(&status);

    pid_t new_val = 5;
    close(fileDes[1]); // closing the writing end of the pipe.
    read(fileDes[0], &new_val, sizeof(new_val));
    printf("Message read with number %d: \n", new_val);

}


int main() {
    int status;
    int fd[2];
    printf("Main process[%d]\n", getpid());
    pid_t root = addChild(processX, fd);
    wait(&status);
    printf("We are going to read from X to Main and then return the Value we got from Y\n");
    return 0;
}

Я не знаю, чтобы создать канал из Y - X, а затем из X - Main ....

Y ----> send pid ----> Xполучил Y pid ----- отправил новую информацию на главную ---> Основная распечатка получила данные ...

1 Ответ

0 голосов
/ 24 сентября 2018

Мой ответ я придумал

#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <stdlib.h> // exit
#include <fcntl.h>
#include <sys/wait.h>
void processX();
void processY();

pid_t addChild(void (*childPtr) (), int fileDes[2], int backToMainFd[2]) {
    pid_t cpid;
    if(childPtr != *processX //prevents the the pipe from main to x from recreating
        pipe(fileDes);

    if((cpid=fork()) == 0) {
        if(childPtr == *processX) {
            childPtr(fileDes, backToMainFd);
        } else {
            childPtr(fileDes);
        }
        wait(NULL);
        exit(0);
    } else if (cpid < 0) {
        printf("failed to fork");
        exit(1);
    } else {

    }
    return cpid;
}

void processY(int fileDes[2]) {
    printf("[PROCESS Y]: Child Y[%d] Created of Parent X[%d]\n", getpid(), getppid());
    pid_t a = getpid();
    char buf[1024]; // child reads from pipe() to buffer
    close(fileDes[0]); // close reading end of the pipe
    write(fileDes[1], &a, sizeof(buf) / sizeof(int));

}

void processX(int fileDes[2], int BackToMainFd[2]) {
    printf("[PROCESS X]: Child X[%d] Created of parent Main[%d]\n", getpid(), getppid());
    int status;

    pid_t Y = addChild(processY, fileDes, NULL);
    wait(&status);

    pid_t new_val = 5;
    close(fileDes[1]); // closing the writing end of the pipe.
    read(fileDes[0], &new_val, sizeof(new_val));
    printf("[PROCESS X]: We got Ys' PID as:%d from [PROCESS Y]\n", new_val);

    close(BackToMainFd[0]); // close reading end of the pipe
    char buf[1024]; // child reads from pipe() to buffer
    write(BackToMainFd[1], &new_val, sizeof(buf) / sizeof(pid_t));

}


int main() {
    int status;
    int fd[2];
    int backToMainFD[2];
    printf("Main process[%d]\n", getpid());
    pipe(backToMainFD);
    pid_t root = addChild(processX, fd, backToMainFD);
    wait(&status);

    pid_t new_val = 5;
    close(backToMainFD[1]); // closing the writing end of the pipe.
    read(backToMainFD[0], &new_val, sizeof(new_val));
    printf("[MAIN]: We got Ys' PID as:%d from [PROCESS X]\n", new_val);
    printf("Send sig kills too Y and root\n");
    kill(new_val, SIGKILL);
    kill(root, SIGKILL);
    printf("Terminate program.\n");
    return 0;
}
...