Chinaunix首页 | 论坛 | 博客
  • 博客访问: 951027
  • 博文数量: 104
  • 博客积分: 1919
  • 博客等级: 上尉
  • 技术积分: 1910
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-21 16:33
文章分类
文章存档

2016年(4)

2015年(1)

2014年(6)

2013年(16)

2012年(27)

2011年(49)

2010年(1)

分类: LINUX

2012-09-10 16:48:45

程序的实现是两个进程,通过信号量来实现通信,发送方先request发送方的信号量,然后发送,然后再release接收方信号量,这样可以通知接手方可以接收了,接受方接收以后再通过信号量通知发送方,一直这样循环,直到发送方发送"exit"双方才能退出进程。

数据的传送是通过消息队列传送的。

具体对函数的介绍和实现方法这里就不多说了,信号量和消息队列的知识点还是有点多的,可以参考《linux程序设计》这本书,书上讲的很详细,例题也很好!

下面就贴上代码给大家参考参考!

发送代码:

  1. #include    
  2. #include    
  3. #include    
  4. #include    
  5. #include    
  6. #include    
  7. #include    
  8. #define SIZE 128   
  9.   
  10. struct msgbuf//消息的发送和接受要用到的结构体   
  11. {  
  12.     long mtype;//消息的类型   
  13.     char mtext[SIZE];//消息的数据   
  14. };  
  15.   
  16. /* 
  17. *功能:发送消息 
  18. *参数1:信号量的ID 
  19. *参数2:消息的ID 
  20. *如果发送“exit”字符串,返回-1,其它返回0; 
  21. */  
  22. int send(int sem_id, int msg_id)  
  23. {  
  24.     struct msgbuf msg;  
  25.     if ( request_sem(sem_id, 0) == -1 )//请求第一个信号量的资源   
  26.     {  
  27.         printf("request the frist semaphore failed!\n");  
  28.     }  
  29.     msg.mtype = 1;  
  30.     printf("input:");  
  31.     fgets(msg.mtext,sizeof(msg.mtext),stdin);  
  32.     msgsnd(msg_id, &msg, SIZE, 0);//发送到消息队列中   
  33.   
  34.     if ( release_sem(sem_id,1) == -1 )//释放第二个信号量的资源   
  35.     {  
  36.         printf("release the second semaphore failed!\n");  
  37.     }  
  38.     if ( strcmp(msg.mtext,"exit\n") == 0 )  
  39.         return -1;  
  40.     return 0;  
  41. }  
  42.   
  43. void init_sem(int sem_id)  
  44. {  
  45.     semctl(sem_id,0,SETVAL,1);//对第一个信号量的初始化   
  46.     semctl(sem_id,1,SETVAL,0);//对第二个信号量的初始化   
  47. }  
  48.   
  49. int create_sem(key_t key)//创建信号量   
  50. {  
  51.   
  52.     return semget(key,2,IPC_CREAT | 0666 );  
  53. }  
  54.   
  55. int create_msg(key_t key)//创建消息队列   
  56. {  
  57.   
  58.     return msgget(key,IPC_CREAT | 0666);  
  59. }  
  60.   
  61. int release_sem(int sem_id, int i)//释放信号量函数   
  62. {  
  63.     struct sembuf sb;  
  64.     sb.sem_num = i;//信号量的索引   
  65.     sb.sem_op = 1;//1表示信号量加1   
  66.     sb.sem_flg = SEM_UNDO;//信号量资源不够时等待资源的释放   
  67.     return semop(sem_id,&sb,1);   
  68. }  
  69.   
  70. int request_sem(int sem_id, int i)//信号量的请求   
  71. {  
  72.     struct sembuf sb;  
  73.     sb.sem_num = i;  
  74.     sb.sem_op = -1;//-1表示信号量-1   
  75.     sb.sem_flg = SEM_UNDO;  
  76.     return semop(sem_id,&sb,1);  
  77. }  
  78.   
  79. int main()  
  80. {  
  81.     int sem_id;  
  82.     int msg_id;  
  83.     key_t key;  
  84. //  char buffer[SIZE];   
  85.     key = ftok(".",'e');  
  86.     sem_id = create_sem(key);  
  87.     msg_id = create_msg(key);  
  88.     if (sem_id == -1 || msg_id == -1)  
  89.     {  
  90.         printf("create failed\n");  
  91.         exit(0);  
  92.     }  
  93.     init_sem(sem_id);  
  94.     while(1)  
  95.     {  
  96.         if ( send(sem_id, msg_id) == -1 )  
  97.             break;    
  98.     }  
  99.               
  100.     return 0;  
  101. }  
第二段代码就不注释了,大致相同,如果第一段能看懂第二段就没问题了。

接收代码:


  1. #include    
  2. #include    
  3. #include    
  4. #include    
  5. #include    
  6. #include    
  7. #include    
  8. #define SIZE 128   
  9.   
  10. struct msgbuf  
  11. {  
  12.     long mtype;  
  13.     char mtext[SIZE];  
  14. };  
  15.   
  16.   
  17. int recive(int sem_id, int msg_id)  
  18. {  
  19.     struct msgbuf msg;  
  20.     if ( request_sem(sem_id, 1) == -1 )  
  21.     {  
  22.         printf("request the second semaphore failed!\n");  
  23.     }  
  24.     msgrcv(msg_id, &msg, SIZE, 0, 0);  
  25.     printf("%s",msg.mtext);  
  26.     if ( strcmp(msg.mtext,"exit\n") == 0)  
  27.         return -1;  
  28.     if ( release_sem(sem_id,0) == -1 )  
  29.     {  
  30.         printf("release the frist semaphore failed!\n");  
  31.     }  
  32.     return 0;  
  33. }  
  34.   
  35.   
  36. void init_sem(int sem_id)  
  37. {  
  38.     semctl(sem_id,0,SETVAL,1);  
  39.     semctl(sem_id,1,SETVAL,0);  
  40. }  
  41.   
  42. int create_sem(key_t key)  
  43. {  
  44.   
  45.     return semget(key,2,IPC_CREAT | 0666 );  
  46. }  
  47.   
  48. int create_msg(key_t key)  
  49. {  
  50.   
  51.     return msgget(key,IPC_CREAT | 0666);  
  52. }  
  53.   
  54. int release_sem(int sem_id, int i)  
  55. {  
  56.     struct sembuf sb;  
  57.     sb.sem_num = i;  
  58.     sb.sem_op = 1;  
  59.     sb.sem_flg = SEM_UNDO;  
  60.     return semop(sem_id,&sb,1);   
  61. }  
  62.   
  63. int request_sem(int sem_id, int i)  
  64. {  
  65.     struct sembuf sb;  
  66.     sb.sem_num = i;  
  67.     sb.sem_op = -1;  
  68.     sb.sem_flg = SEM_UNDO;  
  69.     return semop(sem_id,&sb,1);  
  70. }  
  71.   
  72. int main()  
  73. {  
  74.     int sem_id;  
  75.     int msg_id;  
  76.     key_t key;  
  77.     key = ftok(".",'e');  
  78.     sem_id = create_sem(key);  
  79.     msg_id = create_msg(key);  
  80.     if (sem_id == -1 || msg_id == -1)  
  81.     {  
  82.         printf("create failed\n");  
  83.         exit(0);  
  84.     }  
  85.     while(1)  
  86.     {  
  87.         if ( recive(sem_id, msg_id) == -1)  
  88.             break;    
  89.     }         
  90.     msgctl(msg_id,IPC_RMID,0);  
  91.     return 0;  
  92. }  
阅读(2361) | 评论(0) | 转发(3) |
给主人留下些什么吧!~~