linux 命名信号量实现进程间的互斥与同步

/* 
   命名信号量不带内存共享,编译时要带库文件-lpthread或-lrt 
   int sem_wait(sem_t *sem); //P操作,若是信号量大于零则减一,否则阻塞在该函数位置等待. 
   int sem_post(sem_t *sem); //V操作,信号量加一 
   sem_t *sem_open(const char *name, int oflag);//打开信号量,flag参数与打开普通文件的标记一样 
   sem_t *sem_open(const char *name, int oflag,mode_t mode, unsigned int value); 
 //创建并打开信号量,value参数指的是信号量的初始值 
int sem_unlink(const char *name);//删除系统创建的信号量 
int sem_close(sem_t *sem);//关闭彻底销毁信号量 
 */ 





[文件] sem_dan_syn.c ~ 2KB    下载(68)

01 #include <stdio.h>
02 #include <errno.h>
03 #include <semaphore.h>
04 #include <fcntl.h>
05  
06 /*
07    命名信号量不带内存共享,编译时要带库文件-lpthread或-lrt
08    int sem_wait(sem_t *sem); //P操作,若是信号量大于零则减一,否则阻塞在该函数位置等待.
09    int sem_post(sem_t *sem); //V操作,信号量加一
10    sem_t *sem_open(const char *name, int oflag);//打开信号量,flag参数与打开普通文件的标记一样
11    sem_t *sem_open(const char *name, int oflag,mode_t mode, unsigned int value);
12 //创建并打开信号量,value参数指的是信号量的初始值
13 int sem_unlink(const char *name);//删除系统创建的信号量
14 int sem_close(sem_t *sem);//关闭彻底销毁信号量
15  */
16  
17 /*进程排斥*/
18  
19 #define SEM_NAME "mysem"
20 #define OPEN_FLAG O_RDWR|O_CREAT
21 #define OPEN_MODE 00777
22 #define INIT_V    0
23 static sem_t *sem = NULL;
24  
25 static void mysem(char *str)
26 {
27     int i = 0;
28     while('\0' != str[i])
29     {
30         printf("%c\n", str[i++]);
31         sleep(1);
32     }
33 }
34  
35  
36 /*单次同步, 把信号量先初始化为0*/
37  
38 int main(void)
39 {
40  
41     pid_t pid = -1;
42     int ret = -1;
43     int status = -1;
44  
45     //创建一个命名信号量
46     sem = sem_open(SEM_NAME, OPEN_FLAG, OPEN_MODE, INIT_V);
47  
48     //创建子进程
49     pid = fork();
50     if(-1 == (ret = pid))
51     {
52         perror("fork failed: ");
53         goto _OUT;
54     }
55  
56     if(0 == pid)
57     {
58         mysem("abcd");
59         //V操作
60         sem_post(sem);
61     }
62  
63     if(0 < pid)
64     {
65         //P操作
66         sem_wait(sem);
67         mysem("1234");
68         //等待子进程结束
69         wait(&status);
70         //删掉在系统创建的信号量
71         sem_unlink(SEM_NAME);
72         //彻底销毁打开的信号量
73         sem_close(sem);
74     }
75  
76 _OUT:
77     return ret;
78 }

[文件] sem_diedai_syn.c ~ 2KB    下载(42)

001 #include <stdio.h>
002 #include <errno.h>
003 #include <semaphore.h>
004 #include <fcntl.h>
005 #include <signal.h>
006  
007 /*
008    命名信号量不带内存共享,编译时要带库文件-lpthread或-lrt
009    int sem_wait(sem_t *sem); //P操作,若是信号量大于零则减一,否则阻塞在该函数位置等待.
010    int sem_post(sem_t *sem); //V操作,信号量加一
011    sem_t *sem_open(const char *name, int oflag);//打开信号量,flag参数与打开普通文件的标记一样
012    sem_t *sem_open(const char *name, int oflag,mode_t mode, unsigned int value);
013 //创建并打开信号量,value参数指的是信号量的初始值
014 int sem_unlink(const char *name);//删除系统创建的信号量
015 int sem_close(sem_t *sem);//关闭彻底销毁信号量
016  */
017  
018 #define SEM_NAME1 "mysem1"
019 #define SEM_NAME2 "mysem2"
020 #define OPEN_FLAG O_RDWR|O_CREAT
021 #define OPEN_MODE 00777
022  
023 static sem_t *sem1 = NULL;
024 static sem_t *sem2 = NULL;
025  
026 //临界区
027 static void mysem(char *str)
028 {
029     int i = 0;
030     while('\0' != str[i])
031     {
032         printf("%c\n", str[i++]);
033         sleep(1);
034     }
035 }
036 //信号捕捉处理
037 static void myhandler(void)
038 {
039         //删掉在系统创建的信号量
040         sem_unlink(SEM_NAME1);
041         sem_unlink(SEM_NAME2);
042         //彻底销毁打开的信号量
043         sem_close(sem1);   
044         sem_close(sem2);   
045 }
046  
047  
048 /*迭代同步,两个信号量,开始时一个为1,一个为0, 一个进程执行完换另一个进程运行*/
049  
050 int main(void)
051 {
052  
053     pid_t pid = -1;
054     int ret = -1;
055     int status = -1;
056  
057     //安装捕捉信号
058     signal(SIGINT,(void *)myhandler );
059  
060     //创建一个命名信号量
061     sem1 = sem_open(SEM_NAME1, OPEN_FLAG, OPEN_MODE, 1);   
062     sem2 = sem_open(SEM_NAME2, OPEN_FLAG, OPEN_MODE, 0);   
063  
064     //创建子进程
065     pid = fork();
066     if(-1 == (ret = pid))
067     {
068         perror("fork failed: ");
069         goto _OUT;
070     }
071  
072     if(0 == pid)
073     {
074         while(1)
075         {
076         //P操作
077         sem_wait(sem1);
078         mysem("abcd");
079         //V操作
080         sem_post(sem2);
081         }
082     }
083  
084     if(0 < pid)
085     {
086         while(1)
087         {
088         //P操作
089         sem_wait(sem2);
090         mysem("1234");
091         //V操作
092         sem_post(sem1);
093         }
094         //等待子进程结束
095         wait(&status);
096     }
097  
098 _OUT:
099     return ret;
100 }

[文件] sem_paichi.c ~ 2KB    下载(51)

01 #include <stdio.h>
02 #include <errno.h>
03 #include <semaphore.h>
04 #include <fcntl.h>
05  
06 /*
07    命名信号量不带内存共享,编译时要带库文件-lpthread或-lrt
08    int sem_wait(sem_t *sem); //P操作,若是信号量大于零则减一,否则阻塞在该函数位置等待.
09    int sem_post(sem_t *sem); //V操作,信号量加一
10    sem_t *sem_open(const char *name, int oflag);//打开信号量,flag参数与打开普通文件的标记一样
11    sem_t *sem_open(const char *name, int oflag,mode_t mode, unsigned int value);
12     //创建并打开信号量,value参数指的是信号量的初始值
13 int sem_unlink(const char *name);//删除系统创建的信号量
14 int sem_close(sem_t *sem);//关闭彻底销毁信号量
15  */
16  
17  
18 #define SEM_NAME "mysem"
19 #define OPEN_FLAG O_RDWR|O_CREAT
20 #define OPEN_MODE 00777
21 #define INIT_V    1
22 static sem_t *sem = NULL;
23  
24 static void mysem(char *str)
25 {
26     int i = 0;
27     //P操作
28     sem_wait(sem);
29     while('\0' != str[i])
30     {
31         printf("%c\n", str[i++]);
32         sleep(1);
33     }
34     //V操作
35     sem_post(sem);
36 }
37  
38  
39 /*进程排斥,在临界区设置PV操作*/
40  
41 int main(void)
42 {
43  
44     pid_t pid = -1;
45     int ret = -1;
46     int status = -1;
47  
48     //创建一个命名信号量
49     sem = sem_open(SEM_NAME, OPEN_FLAG, OPEN_MODE, INIT_V);
50  
51     //创建子进程
52     pid = fork();
53     if(-1 == (ret = pid))
54     {
55         perror("fork failed: ");
56         goto _OUT;
57     }
58      
59     if(0 == pid)
60     {
61         mysem("abcd");
62     }
63      
64     if(0 < pid)
65     {
66         mysem("1234");
67         //等待子进程结束
68         wait(&status);
69         //删掉在系统创建的信号量
70         sem_unlink(SEM_NAME);
71         //彻底销毁打开的信号量
72         sem_close(sem);
73     }
74  
75 _OUT:
76     return ret;
77 }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值