Хорошо, поэтому я пытался повозиться с этим кодом, который отправлял бы данные значение из родительского процесса в дочерний процесс, потом дочерний процесс возводил его в квадрат и возвращал значение обратно родителю.TLDR, это практическое задание по использованию pipe.Я смог найти примеры, которые демонстрируют эту функциональность, используя два канала.Но мне было интересно, можно ли сделать это только с одной трубкой.
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
int int_pow(int base, int exp){
int sum = base;
for(int i = 1; i<exp; i++){
sum = sum * base;
}
return sum;
}
int main(){
int fd[2]; //0 = read, 1 = write
pid_t pid;
if(pipe(fd) < 0){
printf("Error: could not create pipe.\n");
exit(1);
}
if ((pid = fork()) < 0){
printf("Error: could not create child.\n");
exit(1);
}
printf("\n");
//child process
if (pid == 0){
printf("hello from child.\n");
int random = 0;
int waiting = 0;
waiting = read(fd[0], &random, sizeof(random)+1);
printf("%d\n", random);
random = int_pow(random,2);
write(fd[1], &random, sizeof(random)+1);
} else {
printf("hello from parent.\n");
int random = rand()%100+1;
printf("%d\n", random);
write(fd[1], &random, sizeof(random));
int waiting = 0;
waiting = read(fd[0], &random, sizeof(random)+1);
printf("%d\n", random);
}
close(fd[0]); //close parent read process
close(fd[1]); //close parent write process
return 0;
}
ОБНОВЛЕНИЕ: Мне удалось получить результат, который я получил.Я пытался сделать это намного сложнее, чем нужно.
#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;
}