Witam,
sposob jaki wymyslilem rozwiazania tego zadania to :
utworzenie 3 procesow potomnych
utworzenie tablicy w pamieci wpolnej o rozmiarze 21
w pozycji pierwszej bedzie zapisane ile zostalo juz utworzonych procesow potomnych
nastepne procesy potomne beda zapisywane w tablicy[ilosc procesow zapisanych +1]
Teraz zastanawiam sie jak sprawdzac czy pamiec wspolna zostala utworzona i jesli zostala utworzona to zeby jej nie tworzyc na nowo
jesli nie zostala utworzona to w pozycji pierwszej wpisac 0
nastepnie przy wywolaniu procesu potomnego sprawdzac ile zostalo procesow utworzonych i przypisac nastepny PID procesu jesli ilosc procesow potomnych jest mniejsza od 20
jak na razie udało mi sie zrobić coś takiego:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
#include<limits.h>
#include<time.h>
#include<sys/ipc.h>
#define PROJECTID 0xFF
#define n 21
int main( void )
{
unsigned long i;
int status;
key_t key;
int id, size,flag;
unsigned i2;
unsigned *array;
printf("GENERATO pid [%u]\n",(unsigned)getpid() );
key = ftok("/tmp",PROJECTID);
flag = IPC_CREAT | 0x1B6;
size = n*sizeof( unsigned);
id = shmget(key,size,flag);// tworzenie segmentu pamieci
//watki
for( i=0;i<3;i++ )
{
switch( fork() )
{
case -1: perror( "!.!.!...Blad fork..." ); exit( 1 ); break;
case 0:
printf("%li\n",i);
printf("Child ID\t%d\n",(int)getpid() );
printf("Parent ID\t%d\n",(int)getppid());
if( id>0 )
{
printf( "...utworzony segment wspólny [%u][0x%x]\n\t",id,key );
array = (unsigned*)shmat( id,NULL,0 ); //przylaczenie pamieci do procesu
//Sposób dostępu do obszaru współdzielonego pamięci
printf( "\n przypisywanie1 \n" );
*(array)=(4);
printf( "\n przypisywanie2 \n" );
printf( " cos tam %10u",*(array) );
shmdt( (void*)array );//ponownie odłączamy segment współdzielony od procesu
printf( "\n...zakończono inicjację segmentu wspólnego\n" );
//(void)shmctl( id,IPC_RMID,&buffer ); //i usuwamy z pamięci
}
else
{
{ perror( "!.!.!..nie udalo sie utworzyc pamieci wspoldzielonej.." ); exit( 1 ); }
}
exit( 0 ); break;
default:
wait( &status );
}
}
return 0;
}
ale niestety nie moge wyswietlic liczby, ktora jest zapisywana do pamieci wpolnej
printf( "\n przypisywanie1 \n" );
(array)=(4);
printf( "\n przypisywanie2 \n" );
printf( " cos tam %10u",(array) );
po uruchomieniu programu wyskakuje tylko cos takiego:
GENERATO pid [28454]
0
Child ID 28455
Parent ID 28454
...utworzony segment wspólny [1015831][0xff000003]
przypisywanie1
1
Child ID 28456
Parent ID 28454
...utworzony segment wspólny [1015831][0xff000003]
przypisywanie1
2
Child ID 28457
Parent ID 28454
...utworzony segment wspólny [1015831][0xff000003]
przypisywanie1