Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- #include <unistd.h>
- void utworz_semafor();
- void ustaw_semafor();
- void usun_semafor();
- void usun_potomne(int n);
- key_t key;
- int semafor;
- int numer_sem=1;
- int i;
- int main(int argc, char* argv[])
- {
- if(argc!=4)
- {
- printf("Zla liczba argumentow\n");
- exit(0);
- }
- int limit=atoi(getenv("LIMIT"));
- FILE *ptr;
- system("ps -ux 2>/dev/null | wc -l > ./tmp");
- char str[20];
- ptr=fopen("tmp", "r");
- fgets(str, 20, ptr);
- limit -= atoi(str)-1;
- printf("Users: %d\n", limit);
- if(atoi(argv[3]) > limit + 1)
- {
- printf("Niewystarczajacy limit procesow uzytkownika\n");
- exit(-2);
- }
- utworz_semafor();
- ustaw_semafor();
- char semafor_str[40];
- sprintf(semafor_str, "%d", semafor);
- for(i=0; i<atoi(argv[3]); i++)
- {
- switch(fork())
- {
- case -1:
- perror("FORK ERROR");
- usun_potomne(i);
- usun_semafor();
- exit(1);
- break;
- case 0:
- if(execl(argv[1], argv[1], semafor_str, argv[3], NULL)==0)
- {
- perror("Execl error");
- usun_potomne(i);
- usun_semafor();
- exit(-1);
- }
- break;
- default:
- sleep(1);
- break;
- }
- }
- usun_potomne(atoi(argv[3]));
- usun_semafor();
- fclose(ptr);
- return 0;
- }
- void utworz_semafor()
- {
- key=ftok(".",'P');
- if(key==-1)
- {
- perror("FTOK ERROR");
- exit(1);
- }
- semafor=semget(key, numer_sem, 0600|IPC_CREAT);
- if(semafor==-1)
- {
- perror("SEMGET ERROR");
- exit(1);
- }
- else
- printf("Utworzono semafory - ID: %d, key: %d\n", semafor, key);
- }
- void ustaw_semafor()
- {
- int ustaw_sem;
- for(i=0; i<numer_sem; i++)
- {
- ustaw_sem=semctl(semafor, i, SETVAL, 1);
- if(ustaw_sem==-1)
- {
- perror("SEMCTL ERROR");
- exit(1);
- }
- else
- printf("Ustawiono semafor\n");
- }
- }
- void usun_semafor()
- {
- int usun_sem;
- usun_sem=semctl(semafor, 0, IPC_RMID);
- if(usun_sem==-1)
- {
- perror("Semctl error");
- exit(-1);
- }
- else
- printf("Usunieto semafory\n");
- }
- void usun_potomne(int n)
- {
- int i, status, w;
- for(i=0; i<n; i++)
- {
- w=wait(&status);
- if(w==-1)
- {
- perror("WAIT ERROR");
- usun_semafor();
- exit(1);
- }
- printf("Koniec procesu. PID: %d, status: %d\n", w, status);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement