İşletim Sistemleri (Bahar-2016) Hafta-14/2
Uygulamada önce proc1.cpp çalıştırılmalıdır. Root seviyesinde çalıştırmayı unutmayınız!
#include<iostream> #include<unistd.h> #include<sys/sem.h> #include<sys/ipc.h> #include<stdlib.h> #include<cstdio> using namespace std; int main() { union semun{ int val; //struct semid_ds *buf; //unsigned short int *array; //struct seminfo *inf; }; int sem_id, cikis; struct sembuf islemler[1]; union semun ozellik; ozellik.val=0; // p durumu baslangic degeri sem_id = semget(101,1,IPC_CREAT | IPC_EXCL); cout<<"Sem ID:"<<sem_id<<endl; if(sem_id==-1) { cout<<"semget error"<<endl; perror("semget"); exit(0); } semctl(sem_id,1,SETVAL,ozellik); islemler[0].sem_num=0; islemler[0].sem_op=-1; // p islemine girildikten sonraki degiskenin degerinin degistirilmesi islemler[0].sem_flg=SEM_UNDO; cout<<"P durumu!"<<endl; cikis = semop(sem_id,islemler,1); if(cikis>-1){ cout<<"v izin gonderdi KB deyiz"<<endl; // semafor u yok etmek icin kod yazilacak semctl(sem_id,1,IPC_RMID,ozellik); } else { cout<<"hata olustu!"<<endl; perror("semop"); } }
proc1.cpp P() işlemi yaparken (bekleme durumu) aşağıdaki kod root seviyesinde çalıştırıldığında V() işlemi gerçekleşir. Bu işlem ile proc1.cpp nin bekleme durumu sona erer. Kritik bölgeye girerek kodu işleme başlar. Bu sırada semafor değişkeni azaltılacağından başka bir işlemin KB ye girmesine izin vermez.
#include<iostream> #include<unistd.h> #include<sys/sem.h> #include<sys/ipc.h> #include<stdlib.h> #include<cstdio> using namespace std; int main() { int sem_id, cikis; struct sembuf islemler[1]; sem_id = semget(101,1,IPC_CREAT); cout<<"Sem ID:"<<sem_id<<endl; if(sem_id==-1) { cout<<"semget error"<<endl; exit(0); } islemler[0].sem_num=0; islemler[0].sem_op=1; // v islemi islemler[0].sem_flg=SEM_UNDO; cout<<"v islemi tamamlaniyor"<<endl; cikis = semop(sem_id,islemler,1); if(cikis>-1){ cout<<"v islemi tamamlandi!"<<endl; } else { cout<<"hata olustu!"<<endl; perror("semop"); } }