进程间共享内存(信号量实现同步)

原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值