#include //...standardowe wejście/wyjście #include //...komunikat błędu perror() #include //...identyfikacja procesu geppid() #include //...stąd deklaracje dot. semaforów #include //...maski uprawnień, choć można inaczej //skoro czytamy z linii komend, to nagłówek main() ... int main( int argc,char** argv ) { int nsems; //...zmienna dla ilość semaforów w tworzonym zbiorze int semflag; //...zmienna dla maski tworzenia semaforów key_t key; //...zmienna dla klucza identyfikującego zbiór if( argc>1 ) //...sprawdźmy na początek, czy wywołanie było poprawne { sscanf( argv[1],"%d",&nsems ); //...odczytujemy ilość semaforów if( nsems>0 ) //...sprawdźmy, tak na wszelki wypadek { key = ftok( "/tmp",'a'+'t'+'h'+'r'+'i'+'r' ); //...taki sobie komunikat diagnostyczny printf( "[pid=%u] tworzy zbiór %d semaforów [key=%x]\n",(unsigned)getpid(),nsems,(unsigned)key ); //...przygotujemy maskę tworzenia semaforów semflag = IPC_CREAT | S_IRUSR | S_IWUSR; //...i to już wszystkie czynności przygotowawcze do semget() if( semget( key,nsems,semflag )==-1 ) //...jeżeli,to kłopot { perror( "\tsemget()..." ); exit( 3 ); } /*- a dalej to już tylko diagnostyka ewentualnych błędów -*/ } else{printf("\tbłędna ilość semaforów (n=%d)\n",nsems );exit(2);} } else { printf( "\t%s [%s]\n%s",argv[0],"n", "\tn -rozmiar tworzonej tablicy semaforów\n" ); exit( 1 ); } return 0; }