Я написал две программы 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;
}