this line is unnecessary
[processfarm.git] / main.c
blob9d59ff066da69ead1b6b1b7161bc696644ae53bc
1 /*
3 * Az albbi probram egy processfarmot hoz letre. A fo program vezerli a
4 * dolgozokat es osszegzi a munkat.
6 * Parameterek:
7 * 1. osszes munka (sec)
8 * 2. szakasz (sec)
9 * 3. dolgozok szama (>0)
10 * 4. elso dolgozo kapacitasa
11 * 5. masodik dolgozo ... (opcionalis)
13 * */
15 #include <stdlib.h>
16 #include <stdio.h>
17 #include <unistd.h>
18 #include <sys/types.h>
19 #include <wait.h>
20 #include <signal.h>
22 int X=23; // osszes munka (sec)
23 int D=8; // szakasznyi munka (sec)
24 #define n 3
25 //int n=3; // dolgozok szama
26 #define W1 6
27 #define W2 5
28 #define W3 4
30 int WORK_DONE = 0;
32 pid_t PIDS[n];
34 void work()
36 kill(getppid(), SIGUSR1);
39 void ticker()
41 int i, expected;
42 expected=X-WORK_DONE;
43 printf("pid=%d received SIGALRM\n", getpid());
44 if (expected > 0) {
45 for (i=0; i<n; i++) {
46 kill(PIDS[i], SIGUSR1);
47 expected -= 6; // FIXME - a dolgozohoz kapcsolodo kapacitas (Wx)
48 if (expected <= 0) {
49 return;
52 } else {
53 exit(0);
57 void worker_done()
59 printf("parent: SIGUSR1 received\n");
60 WORK_DONE += W1; // FIXME - a dolgozohoz kapcsolodo kapacitas (Wx)
63 pid_t cw() //create worker
65 pid_t child;
67 if ((child = fork()) == 0) {
68 while(1) {
69 if (signal(SIGUSR1, work) == SIG_ERR) {
70 printf("child: SIGUSR1 failed\n");
72 pause();
75 return child;
78 void help() {
79 printf("\n\nElso parameter: osszes munka\n\
80 Masodik parameter: egysegnyi munka\n\
81 stb");
84 int main(int argc, char* argv[])
86 int i=0;
88 if (argc < 5) { // NOTE: main always got program name as the first param
89 printf("Legalabb 4 parametert meg kell adnia!\n");
90 help();
91 exit(1);
94 if (atoi(argv[3]) != argc-4) {
95 printf("A dolgozok szamaval egyezo szamu kapacitast kell megadnia!\n");
96 printf("Dolgozok: %s Kapacitasok: %i", argv[3], argc-4);
97 help();
98 exit(1);
101 X = atoi(argv[1]);
102 D = atoi(argv[2]);
103 //n = atoi(argv[3]);
105 while (i<n) {
106 PIDS[i] = cw();
107 printf("PID: %d\n", PIDS[i]);
108 i++;
111 if (signal(SIGALRM, ticker) == SIG_ERR) {
112 printf("parent: SIGALRM failed\n");
114 if (signal(SIGUSR1, worker_done) == SIG_ERR) {
115 printf("parent: SIGUSR1 failed\n");
117 while(1) {
118 while(alarm(D) != 0) {
119 printf("KESZ: %i", WORK_DONE);
120 pause();
123 return 0;