原创作品,允许转载,转载时请务必以超链接形式标明文章
原始出处 、作者信息和本声明。否则将追究法律责任。
http://yongjiuzhizhen.blog.51cto.com/7980250/1323062
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <string.h>
int
main(
int
argc,
char
* argv[])
{
int
running = 1;
int
shid;
int
semid;
int
value;
int
read_num;
FILE
*stream;
char
* sharem=NULL;
struct
sembuf sem_b;
sem_b.sem_num = 0;
sem_b.sem_flg = SEM_UNDO;
if
((semid = semget((key_t)123456,1,0666|IPC_CREAT))==-1)
{
perror
(
"semget"
);
exit
(EXIT_FAILURE);
}
if
(semctl(semid,0,SETVAL,0)==-1)
{
printf
(
"sem init error"
);
if
(semctl(semid,0,IPC_RMID,0)!=0)
{
perror
(
"semctl"
);
exit
(EXIT_FAILURE);
}
exit
(EXIT_FAILURE);
}
shid = shmget((key_t)654321,(
size_t
)30,0600|IPC_CREAT);
if
(shid == -1)
{
perror
(
"shmget"
);
exit
(EXIT_FAILURE);
}
sharem = shmat(shid,NULL,0);
if
(sharem==NULL)
{
perror
(
"shmat"
);
exit
(EXIT_FAILURE);
}
stream =
fopen
(
"data.in"
,
"r"
);
while
(running)
{
// printf("write data operate\n");
// while((semctl(semid,0,GETVAL))==1);
if
((value=semctl(semid,0,GETVAL))==0)
{
// if((read_num = fread(sharem,20,1,stream))==0)
// running--;
if
(
fscanf
(stream,
"%s"
,sharem)!=EOF)
{
printf
(
"%s\n"
,sharem);
sem_b.sem_op = 1;
if
(semop(semid,&sem_b,1)==-1)
{
printf
(
"error\n"
);
exit
(EXIT_FAILURE);
}
}
else
break
;
}
}
printf
(
"send completed\n"
);
fclose
(stream);
shmdt(sharem);
return
0;
}
|
以上是sender进程。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <string.h>
int
main(
int
argc,
char
*argv[])
{
int
running = 1;
char
*shm_p = NULL;
int
shmid;
int
value;
int
semid;
FILE
*stream;
struct
sembuf sem_b;
sem_b.sem_num=0;
sem_b.sem_flg=SEM_UNDO;
semid=semget((key_t)123456,1,0666|IPC_CREAT);
shmid = shmget((key_t)654321,(
size_t
)30,0600|IPC_CREAT);
shm_p = shmat(shmid,NULL,0);
printf
(
"read data operate\n"
);
//stream = fopen("data.out","w+");
char
buffer[50];
while
(running)
{
while
((value=semctl(semid,0,GETVAL))==1)
{
stream =
fopen
(
"data.out"
,
"a+"
);
sem_b.sem_op = -1;
if
(semop(semid,&sem_b,1)==-1)
{
printf
(
"error\n"
);
exit
(EXIT_FAILURE);
}
strcpy
(buffer,shm_p);
printf
(
"%s\n"
,buffer);
//fwrite(shm_p,20,1,stream);
fprintf
(stream,
"%s\n"
,buffer);
fclose
(stream);
}
if
(
strcmp
(shm_p,
"end"
)==0)
running--;
}
shmdt(shm_p);
if
(shmctl(shmid,IPC_RMID,0)!=0)
{
perror
(
"shmctl"
);
exit
(EXIT_FAILURE);
}
if
(semctl(semid,0,IPC_RMID,0)!=0)
{
perror
(
"semctl"
);
exit
(EXIT_FAILURE);
}
return
0;
}
|
以上是receiver进程。
sender:从data.in中读取数据写入到共享内存。
receiver:从共享内存读数据,写入到data.out。
以end作为结束符。
用信号量作为同步机制。
本文出自 “永久指针” 博客,请务必保留此出处http://yongjiuzhizhen.blog.51cto.com/7980250/1323062