• 信号量应用


    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

  • 相关阅读:
    2017/4/14 afternoon
    2017/4/14 morning补
    2017/4/13 afternoon
    2017/4/13 morning
    2017/4/12 afternoon
    2017/4/12 morning
    4.17上午
    4.14上午
    4.13下午
    4.13上午
  • 原文地址:https://www.cnblogs.com/umgsai/p/3908220.html
Copyright © 2020-2023  润新知