Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Napisz program, który stworzy zbiór dziesięciu semaforów, o wartości początkowej równej jeden, a następnie stworzy dziesięć procesów potom- nych, które wstępnie zostaną uśpione na sekundę, a następnie ustawią wartość odpowiadającego im semafora na zero. Proces rodzicielski może się zakończyć dopiero wtedy, kiedy ostatni semafor ze zbioru osiągnie wartość zero.
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/ipc.h>
- #include <sys/types.h>
- #include <sys/sem.h>
- #include <sys/wait.h>
- #include <unistd.h>
- #define NUMBER 10
- void down_operation(int semid, u_short sem_num)
- {
- struct sembuf down_operation = {sem_num, -1, 0};
- if(semop(semid, &down_operation, 1) == -1){
- perror("semop");
- exit(EXIT_FAILURE);
- }
- printf("Wartosc semafora nr %d zostala ustawiona na 0\n", (int)sem_num);
- }
- int main()
- {
- pid_t pids[NUMBER];
- int semid;
- if((semid = semget(IPC_PRIVATE, NUMBER, 0775|IPC_CREAT|IPC_EXCL)) == -1){
- perror("semget");
- return EXIT_FAILURE;
- }
- for(int i = 0; i < NUMBER; i++){
- if(semctl(semid, i, SETVAL, 1) == -1){
- perror("semctl");
- exit(EXIT_FAILURE);
- }
- }
- for(int i = 0; i < NUMBER; i++){
- pids[i] = fork();
- if(pids[i] == -1){
- perror("fork");
- return EXIT_FAILURE;
- }
- else if(pids[i] == 0){
- printf("Potomek nr %d: czekam 1s...\n", i);
- sleep(1);
- down_operation(semid, i);
- }
- else{
- wait(0);
- if(i == NUMBER-1){
- if(semctl(semid, 0, IPC_RMID) == -1){
- perror("semctl");
- return EXIT_FAILURE;
- }
- printf("Wartosc ostatniego semafora rowna 0, konczenie programu\n");
- }
- return EXIT_SUCCESS;
- }
- }
- return EXIT_SUCCESS;
- }
Add Comment
Please, Sign In to add comment