01.
#include <stdio.h>
02.
#include <stdlib.h>
03.
#include <string.h>
04.
#include <sys/types.h>
05.
#include <sys/ipc.h>
06.
#include <sys/shm.h>
07.
#include <errno.h>
08.
#include "sem.h"
09.
10.
typedef
struct
11.
{
12.
char
buf[1024];
13.
}memory;
14.
15.
int
main(
int
argc,
const
char
*argv[])
16.
{
17.
key_t key;
18.
memory *p = NULL;
19.
int
shmid;
20.
int
create_flag = 0;
21.
int
sem_id;
22.
if
((key = ftok(
"."
,
'a'
)) < 0)
23.
{
24.
perror
(
"failed to get key"
);
25.
exit
(-1);
26.
}
27.
28.
if
((sem_id = semget(key, 1, 0666 | IPC_CREAT | IPC_EXCL)) < 0)
29.
{
30.
if
(
errno
== EEXIST)
31.
{
32.
if
((sem_id = semget(key, 1, 0666)) < 0)
33.
{
34.
perror
(
"failed to semget"
);
35.
exit
(-1);
36.
}
37.
}
38.
}
39.
40.
init_sem(sem_id, 0);
41.
if
((shmid = shmget(key,
sizeof
(memory), 0666 | IPC_CREAT | IPC_EXCL)) < 0)
42.
{
43.
if
(
errno
== EEXIST)
44.
{
45.
if
((shmid = shmget(key,
sizeof
(memory), 0666)) < 0)
46.
{
47.
perror
(
"failed to shmget memory"
);
48.
exit
(-1);
49.
}
50.
}
51.
else
52.
{
53.
perror
(
"failed to shmget"
);
54.
exit
(-1);
55.
}
56.
}
57.
else
58.
create_flag = 1;
59.
if
((p = shmat(shmid, NULL, 0)) == (
void
*)(-1))
60.
{
61.
perror
(
"failed to shmat memory"
);
62.
exit
(-1);
63.
}
64.
while
(1)
65.
{
66.
printf
(
">"
);
67.
fgets
(p->buf,
sizeof
(p->buf), stdin);
68.
p->buf[
strlen
(p->buf) - 1] = 0;
69.
sem_v(sem_id);
70.
if
(
strncmp
(p->buf,
"quit"
, 4) == 0)
71.
break
;
72.
}
73.
74.
if
(create_flag == 1)
75.
{
76.
if
(shmdt(p) < 0)
77.
{
78.
perror
(
"failed to shmdt memory"
);
79.
exit
(-1);
80.
}
81.
82.
if
(shmctl(shmid, IPC_RMID, NULL) == -1)
83.
{
84.
perror
(
"failed to delete share memory"
);
85.
exit
(-1);
86.
}
87.
delete_sem(sem_id);
88.
}
89.
return
0;
90.
}