linux多進程通信

1. 信號量機制實現進程通信:

先看一個例子摘自:http://blog.chinaunix.net/uid-23215128-id-2938280.html

使用sem_opensem_unlink,sem_getvalue,sem_post,sem_wait,sem_close,等信號量機制

1. sem_sync.h

  1. #ifndef _SEM_SYNC_H_
  2. #define _SEM_SYNC_H_
  3. #include <sys/types.h>
  4. #include <sys/ipc.h>
  5. #include <sys/shm.h>
  6. #include <stdio.h>
  7. #include <semaphore.h>
  8. #include <sys/types.h>
  9. #include <sys/stat.h>
  10. #include <fcntl.h>
  11.   
  12. char SEM_A_TASK_IS_FREE[]= "a_task_is_free";
  13. char SEM_B_TASK_IS_FREE[]= "b_task_is_free";

  14. #endif

進程a 

  1. #include "sem_sync.h"

  2. int main()
  3. {
  4.     sem_t *sem_a_task_is_free;
  5.     sem_t *sem_b_task_is_free;
  6.     int val;

  7.     sem_a_task_is_free = sem_open(SEM_A_TASK_IS_FREE, O_CREAT, 0644, 1);
  8.     sem_b_task_is_free = sem_open(SEM_B_TASK_IS_FREE, O_CREAT, 0644, 0);
  9.     if (sem_a_task_is_free == SEM_FAILED || sem_b_task_is_free == SEM_FAILED)
  10.     {
  11.         perror("unable to create semaphore");
  12.         sem_unlink(SEM_A_TASK_IS_FREE);
  13.         exit(-1);
  14.     }

  15.     //while (1 == 1)
  16.     {
  17.         printf("run a task......\n");
  18.         getchar();

  19.         sem_getvalue(sem_a_task_is_free, &val);
  20.         printf("The sem is %d\n", val);
  21.         sem_post(sem_a_task_is_free);
  22.         sem_getvalue(sem_a_task_is_free, &val);
  23.         printf("The sem after sem post is %d\n", val);
  24.         printf("send->a_task_is_free\n");
  25.         
  26.         printf("\nwaite sem_b_task_is_free\n");
  27.         //sem_wait(sem_b_task_is_free);
  28.         printf("recv<-sem_b_task_is_free\n");
  29.     }

  30.     sem_close(sem_a_task_is_free);
  31.     sem_unlink(SEM_A_TASK_IS_FREE);

  32.     _exit(0);
  33. }

//gcc a.c -lpthread  -o a

 

進程b 

  1. #include "sem_sync.h"

  2. int main()
  3. {
  4.     int val;
  5.     sem_t *sem_a_task_is_free;
  6.     sem_t *sem_b_task_is_free;

  7.     sem_a_task_is_free = sem_open(SEM_A_TASK_IS_FREE, O_CREAT, 0644, 0);
  8.     sem_b_task_is_free = sem_open(SEM_B_TASK_IS_FREE, O_CREAT, 0644, 1);
  9.     if (sem_a_task_is_free == SEM_FAILED || sem_b_task_is_free == SEM_FAILED)
  10.     {
  11.         perror("unable to create semaphore");
  12.         sem_unlink(SEM_B_TASK_IS_FREE);
  13.         exit(-1);
  14.     }

  15.     //while (1 == 1)
  16.     {
  17.         printf("\nrun b_task......\n");
  18.         sem_getvalue(sem_a_task_is_free, &val);
  19.         printf("The sem is %d\n", val);
  20.         sleep(1);
  21.         //sem_post(sem_b_task_is_free);
  22.         printf("send->sem_b_task_is_free\n");
  23.         printf("\nwaite a_task_is_free\n");
  24.         sem_getvalue(sem_a_task_is_free, &val);
  25.         printf("The sem 2 is %d\n", val);
  26.         sem_wait(sem_a_task_is_free);
  27.         sem_getvalue(sem_a_task_is_free, &val);
  28.         printf("The sem 3 is %d\n", val);
  29.         printf("recv<-a_task_is_free\n");
  30.     }

  31.     sem_close(sem_a_task_is_free);
  32.     sem_close(sem_b_task_is_free);

  33.     sem_unlink(SEM_B_TASK_IS_FREE);
  34.     exit(0);
  35. }

//gcc b.c -lpthread -o b

 

#./a

#./b

備註:只要信號量沒有釋放,sem_unlink,那信號量值將保持不變,sem_post將使信號量增加1,sem_wait將使信號量減1.



發佈了90 篇原創文章 · 獲贊 17 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章