Witam wszystkich, jestem nowy.
Mam Problem z przesłaniem tablicy int-ów z procesu rodzica do dziecka.
Proces dziecka czyta z potoku kolejne liczby tyle ,że elementy od 1 do n czyta dwa razy np.
wysłane:
1,2,3,4,5,6,7,8,9
odebrane:
1,2,2,3,3,4,4,5,5
Docelowo program na sortować tablice liczb ,najpierw w jednym procesie ,a następnie połowę tablicy posortuje "rodzic" , a drugą połowę "dziecko" ,dalej quick sortem złączyć dwie połówki i porównać czasy sortowania przez 1 i 2 procesy dla różnych n.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/time.h>
struct timeval start,stop, temp;
void czas()
{
gettimeofday(&stop,0);
if ((stop.tv_usec-start.tv_usec)<0) {
temp.tv_sec = stop.tv_sec-start.tv_sec-1;
temp.tv_usec = 1000000000+stop.tv_usec-start.tv_usec-999000000;
} else {
temp.tv_sec = stop.tv_sec-start.tv_sec;
temp.tv_usec = stop.tv_usec-start.tv_usec;
}
printf( "%lu", temp.tv_sec);
printf( "%s", "s ");
printf( "%lu", temp.tv_usec);
printf( "%s\n", "ms ");
}
void bubble(int tab[], int i)
{
int x,y,n=i;
int tmp;
int change;
for (x=0; x<n-1; ++x)
{
change=0;
for (y=0; y<n-1-x; y++)
{
if (tab[y+1] < tab[y]) //porównanie sąsiądów
{
tmp = tab[y];
tab[y] = tab[y+1];
tab[y+1] = tmp; //wypchanie bąbelka
change=1;
}
}
if(!change) break; // nie dokonano zmian - koniec!
}
}
int main( int argc, char **argv )
{
pid_t pid;
int mypipe[2];
if(pipe(mypipe)) //Funkcja pipe() umieszcza dwa nowe deskryptory plików w tablicy mypipe[]
//(mypipe[0] – deskryptor pliku tylko do odczytu, mypipe[1] – deskryptor pliku tylko do zapisu)
{
fprintf(stderr, "Pipe- nie udało się\n"); //pisze do standardowego wyjścia błędów
return EXIT_FAILURE;
}
//tworzymy proces dziecko
pid=fork();
if (pid==(pid_t)0) //sprawdza czy proces jest rodzicem czy dzieckiem
{
//proces dziecko
int i;
if(read(mypipe[0], &i, sizeof(i))) printf("\n%d", i);
int tab[i];
int j;
for(j=0;j<i;j++)
{
read(mypipe[0], &tab[j], sizeof(tab[j]));
printf("\n%d", tab[j]);
}
return EXIT_SUCCESS;
}
else if (pid<(pid_t)0)
{
//tworzenie potomka nie udało się
fprintf(stderr,"Fork failed\n");
return EXIT_FAILURE;
}
else
{
//proces rodzica
int i,j;
for(i = 10 ; i<11;i=i+1000)
{
srand ( time(NULL) );
int tab[i],tab2[i];
for (j=0; j<i;j++) {
tab[j]=tab2[j]=rand()%i;
printf("\n%d", tab[j]);}
printf ("\n%s", "jeden proces: ");
gettimeofday(&start, 0);
bubble(&tab[0],i);
czas();
close (mypipe[0]);
int k=i/2;
write(mypipe[1], &k, sizeof(k));
for(k=i/2;k<i;k++)
{
printf("\n%d", tab2[k]);
write(mypipe[1], &tab2[k], sizeof(&tab2[k]));
}
printf ("\n");
}
return EXIT_SUCCESS;
}
}