[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Тексты программ
Текст программы - semdemo.c
1 #include <unistd.h>
2 #include <stdlib.h>
3 #include <sys/types.h>
4 #include <sys/ipc.h>
5 #include <sys/sem.h>
6 #include <stdio.h>
7 #define DUMMY 0
8 #define COUNT 4
9
10 main(int argc, char *argv[])
11 {
12 key_t ipckey;
13 int semid, pid, creator, i;
14 static struct sembuf lock =
15 { 0, -1, SEM_UNDO };
16 static struct sembuf unlock =
17 { 0, 1, SEM_UNDO };
18
19 setbuf(stdout, (char *) NULL);
20 ipckey = ftok(argv[0], 's');
21 if ((semid = semget(ipckey, 1,
22 IPC_CREAT | IPC_EXCL | 0666)) != -1) {
23 creator = 1;
24 }
25 else {
26 if ((semid = semget(ipckey, 1, 0)) == -1) {
27 perror(argv[0]);
28 exit(1);
29 }
30 creator = 0;
31 }
32 if (creator) {/* initialize semaphore */
33 if (semctl(semid, 0, SETVAL, 1) == -1) {
34 perror(argv[0]);
35 exit(2);
36 }
37 }
38
39 pid = getpid();
40 for (i = 0; i < COUNT; i++ ) {
41 if (semop(semid, &lock, 1) == -1) {
42 perror(argv[0]);
43 exit(3);
44 }
45 printf("[%d] locking\t", pid);
46 sleep(1);/* terminal output being used */
47 printf("[%d] unlocking\n", pid);
48 if (semop(semid, &unlock, 1) == -1) {
49 perror(argv[0]);
50 exit(4);
51 }
52 }
53
54 if (creator) {
55 sleep(5);
56 if(semctl(semid, DUMMY, IPC_RMID, DUMMY) == -1) {
57 perror(argv[0]);
58 exit(5);
59 }
60 }
61 return(0);
62 }
Текст программы - printer.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include <unistd.h>
4 #include <fcntl.h>
5 #include <sys/types.h>
6 #include <sys/ipc.h>
7 #include <sys/sem.h>
8 #include <stdio.h>
9 #include "printer.h"
10
11 main(int argc, char *argv[])
12 {
13 char *printer[NUMPR + 1],buf[BUFSIZ],errmsg[30];
14 key_t ipckey;
15 ushort initial[NUMPR + 1], prntnum;
16 int n, creator, fdin, fdout, semid;
17 struct sembuf operation[2];
18
19 if ((printer[1] = getenv("PRINTER1")) == NULL ||
20 (printer[2] = getenv("PRINTER2")) == NULL) {
21 printf("missing printer assignment\n");
22 exit(1);
23 }
24 if (strncmp(argv[0], "line", 4) == 0)
25 prntnum = 1;
26 else if (strncmp(argv[0], "lase", 4) == 0)
27 prntnum = 2;
28 else /* random choice */
29 prntnum = getpid() % NUMPR + 1;
30
31 ipckey = ftok(argv[0], 's');
32 if ((semid = semget(ipckey, NUMPR + 1,
33 IPC_CREAT | IPC_EXCL | 0666)) != -1) {
34 creator = 1;
35 }
36 else {
37 if ((semid = semget(ipckey, NUMPR + 1,
38 0666)) == -1) {
39 sprintf(errmsg,"%s - semget", argv[0]);
40 perror(errmsg);
41 exit(2);
42 }
43 creator = 0;
44 }
45 if (creator) { /* initialize semaphore set */
46 initial[0] = NUMPR;
47 for (n = 1; n <= NUMPR; n++)
48 initial[n] = 1;
49 if(semctl(semid,DUMMY,SETALL,initial) == -1) {
50 sprintf(errmsg,"%s - SETALL", argv[0]);
51 perror(errmsg);
52 exit(3);
53 }
54 }
55
56 operation[1].sem_num = prntnum;
57 operation[1].sem_op = ACQUIRE;
58 operation[1].sem_flg = SEM_UNDO;
59 operation[0].sem_num = 0;
60 operation[0].sem_op = ACQUIRE;
61 operation[0].sem_flg = SEM_UNDO;
62 if (semop(semid, operation, 2) == -1) {
63 sprintf(errmsg,"%s - ACQUIRE", argv[0]);
64 perror(errmsg);
65 exit(4);
66 }
67 if ((fdin = open(argv[1], O_RDONLY)) == -1) {
68 sprintf(errmsg,"%s - %s", argv[0], argv[1]);
69 perror(errmsg);
70 exit(5);
71 }
72 if((fdout=open(printer[prntnum],O_CREAT | O_WRONLY,0644)) == -
1) {
73 sprintf(errmsg,"%s - %s",argv[0],printer[prntnum]);
74 perror(errmsg);
75 exit(6);
76 }
77 while ((n = read(fdin, buf, BUFSIZ)) > 0)
78 write(fdout, buf, n);
79 operation[1].sem_op = RELEASE;
80 operation[0].sem_op = RELEASE;
81 if (semop(semid, operation, 2) == -1) {
82 sprintf(errmsg,"%s - RELEASE", argv[0]);
83 perror(errmsg);
84 exit(7);
85 }
86
87 }