信号量应用

  1. #include <linux/sem.h> 
  2.  
  3. #include <stdio.h> 
  4.  
  5. #include <errno.h> 
  6.  
  7. #define SEM_PATH "/home/my_sem" 
  8.  
  9. #define max_tries 3  
  10.  
  11.  
  12.  
  13. int semid; 
  14.  
  15. main() 
  16.  
  17.  
  18. int flag1,flag2,key,i,init_ok,tmperrno; 
  19.  
  20. struct semid_ds sem_info; 
  21.  
  22. struct seminfo sem_info2; 
  23.  
  24. union semun arg;    //union semun£º Çë²Î¿ŒžœÂŒ2 
  25.  
  26. struct sembuf askfor_res, free_res; 
  27.  
  28. flag1=IPC_CREAT|IPC_EXCL|00666; 
  29.  
  30. flag2=IPC_CREAT|00666; 
  31.  
  32. key=ftok(SEM_PATH,'a'); 
  33.  
  34. //error handling for ftok here; 
  35.  
  36. init_ok=0; 
  37.  
  38. semid=semget(key,1,flag1);//create a semaphore set that only includes one semphore. 
  39.  
  40. if(semid<0) 
  41.  
  42.  
  43.  tmperrno=errno; 
  44.  
  45.  perror("semget"); 
  46.  
  47. if(tmperrno==EEXIST) 
  48.  
  49. //errno is undefined after a successful library call( including perror call) so it is saved //in tmperrno. 
  50.  
  51.   { 
  52.  
  53.   semid=semget(key,1,flag2); 
  54.  
  55. //flag2 Ö»°üº¬ÁËIPC_CREAT±êÖŸ, ²ÎÊýnsems(ÕâÀïΪ1)±ØÐëÓëÔ­ÀŽµÄÐźŵÆÊýÄ¿Ò»Ö 
  56.  
  57.   arg.buf=&sem_info; 
  58.  
  59.   for(i=0; i<max_tries; i++) 
  60.  
  61.   { 
  62.  
  63.    if(semctl(semid, 0, IPC_STAT, arg)==-1) 
  64.  
  65.    { perror("semctl error"); i=max_tries;} 
  66.  
  67.    else 
  68.  
  69.    {  
  70.  
  71.     if(arg.buf->sem_otime!=0){ i=max_tries;  init_ok=1;} 
  72.  
  73.     else  sleep(1);  
  74.  
  75.    } 
  76.  
  77.   } 
  78.  
  79.   if(!init_ok) 
  80.  
  81.   // do some initializing, here we assume that the first process that creates the sem will  
  82.  
  83.   // finish initialize the sem and run semop in max_tries*1 seconds. else it will not run  
  84.  
  85.   // semop any more. 
  86.  
  87.   { 
  88.  
  89.    arg.val=1; 
  90.  
  91.    if(semctl(semid,0,SETVAL,arg)==-1) perror("semctl setval error"); 
  92.  
  93.   }  
  94.  
  95.  } 
  96.  
  97.  else 
  98.  
  99.  {perror("semget error, process exit");  
  100.  
  101.  exit(1);  
  102.  
  103.  } 
  104.  
  105.  
  106. else //semid>=0; do some initializing   
  107.  
  108.  
  109.  arg.val=1; 
  110.  
  111.  if(semctl(semid,0,SETVAL,arg)==-1) 
  112.  
  113.   perror("semctl setval error"); 
  114.  
  115.  
  116. //get some information about the semaphore and the limit of semaphore in redhat8.0 
  117.  
  118.  arg.buf=&sem_info; 
  119.  
  120.  if(semctl(semid, 0, IPC_STAT, arg)==-1) 
  121.  
  122.   perror("semctl IPC STAT");   
  123.  
  124.  printf("owner's uid is %d ",  arg.buf->sem_perm.uid); 
  125.  
  126.  printf("owner's gid is %d ",  arg.buf->sem_perm.gid); 
  127.  
  128.  printf("creater's uid is %d ",  arg.buf->sem_perm.cuid); 
  129.  
  130.  printf("creater's gid is %d ",  arg.buf->sem_perm.cgid); 
  131.  
  132.  
  133.  
  134.  arg.__buf=&sem_info2; 
  135.  
  136.  if(semctl(semid,0,IPC_INFO,arg)==-1) 
  137.  
  138.   perror("semctl IPC_INFO"); 
  139.  
  140.  printf("the number of entries in semaphore map is %d  ",    arg.__buf->semmap); 
  141.  
  142.  printf("max number of semaphore identifiers is %d  ",     arg.__buf->semmni); 
  143.  
  144.  printf("mas number of semaphores in system is %d  ",     arg.__buf->semmns); 
  145.  
  146.  printf("the number of undo structures system wide is %d  ",   arg.__buf->semmnu); 
  147.  
  148.  printf("max number of semaphores per semid is %d  ",     arg.__buf->semmsl); 
  149.  
  150.  printf("max number of ops per semop call is %d  ",     arg.__buf->semopm); 
  151.  
  152.  printf("max number of undo entries per process is %d  ",     arg.__buf->semume); 
  153.  
  154.  printf("the sizeof of struct sem_undo is %d  ",         arg.__buf->semusz); 
  155.  
  156.  printf("the maximum semaphore value is %d  ",      arg.__buf->semvmx); 
  157.  
  158.   
  159.  
  160. //now ask for available resource:  
  161.  
  162.  askfor_res.sem_num=0; 
  163.  
  164.  askfor_res.sem_op=-1; 
  165.  
  166.  askfor_res.sem_flg=SEM_UNDO;   
  167.  
  168.    
  169.  
  170.   if(semop(semid,&askfor_res,1)==-1)//ask for resource 
  171.  
  172.    perror("semop error"); 
  173.  
  174.   
  175.  
  176.  sleep(3); //do some handling on the sharing resource here, just sleep on it 3 seconds 
  177.  
  178.  printf("now free the resource ");  
  179.  
  180.   
  181.  
  182. //now free resource  
  183.  
  184.  free_res.sem_num=0; 
  185.  
  186.  free_res.sem_op=1; 
  187.  
  188.  free_res.sem_flg=SEM_UNDO; 
  189.  
  190.  
  191.  
  192.  if(semop(semid,&free_res,1)==-1)//free the resource. 
  193.  
  194.   if(errno==EIDRM) 
  195.  
  196.    printf("the semaphore set was removed "); 
  197.  
  198. //you can comment out the codes below to compile a different version:    
  199.  
  200.  if(semctl(semid, 0, IPC_RMID)==-1) 
  201.  
  202.   perror("semctl IPC_RMID"); 
  203.  
  204.  else printf("remove sem ok "); 
  205.  

本文出自 “阿凡达” 博客,请务必保留此出处http://shamrock.blog.51cto.com/2079212/725028

原文地址:https://www.cnblogs.com/umgsai/p/3908220.html