Перенаправление возвращаемого значения с помощью dup2 из двух разных программ - PullRequest
0 голосов
/ 06 мая 2020

Я написал две программы q & p для перенаправления возвращаемого значения с помощью dup2 с q на p.

Я выполняю fork () в "p" и использую execl использовать "q" с дочерним процессом, который я создаю. также я использую dup2 для перенаправления вывода "q" в родительский процесс в "p" , чтобы наконец его распечатать.

Мне интересно, почему Я не вижу вывода на экран, если меняю эту строку в "q" main: printf("return value from q: %s\n", returnByte(argv, str)); на эту строку: returnByte(argv, str);

Я новичок в я буду признателен за любое объяснение.

q программа:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

char* returnByte(char* argv[], char* str);

int main (int argc, char* argv[]){
    char str[20];
    printf("return value from q: %s\n", returnByte(argv, str));

}

char* returnByte(char* argv[], char* str){
    float res = atof(argv[1])+atof(argv[2]);
    snprintf(str, sizeof(str), "%.2f", res);
    return str;
}

p программа:

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

int main(){
    int i;
    float r[4];

    srand(time(NULL));
    for (i=0; i<4; i++){ 
        r[i] = (float)rand() / (float)(RAND_MAX/100); 
    }

    char arg1[10], arg2[10];
    snprintf(arg1, sizeof(arg1), "%.2f", r[0]);
    snprintf(arg2, sizeof(arg1), "%.2f", r[1]); 

    int pfd[2];
    pipe(pfd); //Creating a new pipe

    switch(fork()){ //fork()ing
        case -1: 
            printf("error occured during fork()ing");
            break;

        case 0: //Child process filling "q"'s job using dup2 & execl
            close(pfd[0]);
            dup2(pfd[1], 0);
            close(pfd[1]);
            execl("./q", "./q", arg1, arg2, NULL);          
            break;

        default: //Parent process display the output of q into the screen
            waitpid(-1, NULL, 0); //Wait until child process terminate (finish "q"'s job)
            close(pfd[1]);
            dup2(pfd[0], 1);
            close(pfd[0]);
            break;
    }

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