У меня есть эта часть моего кода, она работает гладко, но я не могу понять, является ли второй созданный процесс внуком первого дочернего процесса или просто дочерним процессом. Это:
if (fork() != 0)
parent(array,N);
else {
child1(array,N);
if(fork() != 0)
child2(array,N);
}
то же самое:
if (fork() != 0)
parent(array,N);
else {
child1(array,N);
}
if (fork() == 0)
child2(array,N);
потому что я получаю те же результаты. У программы есть массив, а родительский элемент вычисляет максимальное значение для 1/3 массива, 1-го дочернего элемента, второго 1/3 и 2-го дочернего элемента третьего. Родитель получает результаты от детей и печатает их. Работает так же для двух версий, которые я показываю выше.
#include <stdio.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
int pfd1[2],pfd2[2]; // pfd[1] gia to prwto paidi , pfd[2] gia to deutero paidi
void parent(int array[],int N) {
int i;
int max_p;
int child1_max,child2_max; //auto pou 8a steilei
max_p=array[0]; // <============================================================================
close(pfd1[1]); //no writing by the parent
close(pfd2[1]); //no writing by the parent
for(i=0;i<N/3;i++) {
if(array[i]>max_p) {
max_p=array[i];
}
}
waitpid(-1, NULL, 0); /* Wait my child process */
read(pfd1[0],&child1_max,sizeof(int)); //get 1st child's max_c
close(pfd1[0]);
read(pfd2[0],&child2_max,sizeof(int)); //get 1st child's max_c
close(pfd2[0]);
printf("1st child_max is %d\n",child1_max);
printf("2nd child_max is %d\n",child2_max);
printf("parents max is %d\n",max_p);
/*if(max_p>child_max) {
printf("max is %d (was in parent)\n",max_p);
printf("max of child is %d\n",child_max);
}else {
printf("max is %d (was in child)\n",child_max);
printf("max of parent is %d\n",max_p);
}*/
}
void child1(int array[],int N) {
int i;
int max_c=array[N/2]; // <============================================================================
close(pfd1[0]); // No reading by child
for(i=N/3;i<(2*N)/3;i++) {
if(array[i]>max_c) {
max_c=array[i];
}
}
write(pfd1[1],&max_c,sizeof(int));
close(pfd1[1]);
}
void child2(int array[],int N) {
int i;
int max_c=array[(2*N)/3]; // <============================================================================
close(pfd2[0]); // No reading by child
for(i=(2*N)/3;i<N;i++) {
if(array[i]>max_c) {
max_c=array[i];
}
}
write(pfd2[1],&max_c,sizeof(int));
close(pfd2[1]);
}
int main(void) {
int array[]={111,1222,10,392,3211,3,2,50,8};
int N=sizeof(array)/sizeof(int);
//printf("\n %d \n",N);
if (pipe(pfd1) < 0)
{
perror("pipe()");
exit(1);
}
if (pipe(pfd2) < 0)
{
perror("pipe()");
exit(1);
}
if (fork() != 0)
parent(array,N);
else {
child1(array,N);
//if(fork() != 0)
// child2(array,N);
}
if (fork() == 0)
child2(array,N);
return 0;
}