免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
论坛 程序设计 C/C++ error
最近访问板块 发新帖
查看: 1168 | 回复: 0
打印 上一主题 下一主题

error [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-09 14:38 |只看该作者 |倒序浏览

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <fcntl.h>
  5. #include <errno.h>
  6. #include <sys/types.h>
  7. #include <sys/ipc.h>
  8. #include <sys/sem.h>

  9. /*-----------------------------------*
  10. * Delete semaphore key                     *
  11. *-----------------------------------*/
  12. int sem_del(key)
  13. int key;
  14. {
  15.         int      semid, sysreturn;
  16.         char     ret1[255];
  17.         char     ret2[255];
  18.         char     msg[255];
  19.         extern int errno;

  20.         if((semid=semget(key,1,IPC_EXCL)) != -1)
  21.         {
  22.                 sysreturn=semctl(semid, 0, IPC_RMID);        /* delete semaphore */
  23.                 if(sysreturn != 0)
  24.                 {
  25.                         return(8);
  26.                 }
  27.                 return(0);
  28.         }
  29.         else
  30.         {
  31.                 return(10);
  32.         }
  33. }

  34. /*-----------------------------------*
  35. * Set new (or reset) process counts *
  36. *-----------------------------------*/
  37. int sem_set(key,cnt)
  38. int key,cnt;
  39. {
  40.         int      semid, sysreturn, ret;
  41.         struct   sembuf  sb[1];
  42.         char     ret1[255];
  43.         char     ret2[255];

  44.         if((semid=semget(key,1,IPC_EXCL)) == -1)
  45.         {
  46.                 semid=semget(key,1,IPC_CREAT|0666);
  47.                 semctl(semid,0,SETVAL,cnt);                /* set semaphore number */
  48.                 return(0);
  49.         }
  50.         else
  51.         {
  52.                 return(1);
  53.         }

  54. }

  55. /*-----------------------------------*
  56. * Check current semaphore number    *
  57. *-----------------------------------*/
  58. int sem_checkval(key)
  59. int key;
  60. {
  61.         int        semid;
  62.         struct        sembuf        sb[1];
  63.         int        ret;

  64.         if((semid=semget(key,1,IPC_EXCL)) == -1)
  65.         {
  66.                  return(1);
  67.         }

  68.         sb[0].sem_num=0;
  69.         sb[0].sem_flg=0;

  70.         ret=semctl(semid,0,GETVAL,1);
  71.         if(ret != -1)
  72.         {
  73.                 printf("%d %d\n",semid,ret);
  74.                 return(0);
  75.         }
  76.         else
  77.         {
  78.                 return(8);
  79.         }


  80. }

  81. /*-------------------------------------*
  82. * Lock and unlock semaphore operation *
  83. *-------------------------------------*/
  84. int sem_landu(cmd,key,opt)
  85. char        cmd[255];
  86. char        opt[255];
  87. int        key;
  88. {
  89.         int      semid, ret;
  90.         struct   sembuf  sb[1];
  91.         char     emesg[255];
  92.         extern int errno;

  93.         if((semid=semget(key,1,IPC_EXCL)) == -1)
  94.         {
  95.                 return(1);                        /* Invalid semaphore key number */
  96.         }

  97.         sb[0].sem_num=0;
  98.         if(strcmp(cmd,"-l") == 0 && strcmp(opt,"NOWAIT") == 0)
  99.         {
  100.                 sb[0].sem_flg=IPC_NOWAIT;
  101.         }
  102.         else if(strlen(opt) == 0)
  103.         {
  104.                 sb[0].sem_flg=0;
  105.         }
  106.         else
  107.         {
  108.                 exit(9);
  109.         }


  110.         if(strcmp(cmd,"-u") == 0)
  111.         {
  112.                 sb[0].sem_op = 1;                /* Unlock semaphore */
  113.         }
  114.         else                                        /* if not "-u", it is "-l" */
  115.         {
  116.                 sb[0].sem_op = -1;                /* lock semaphore */
  117.         }

  118.         ret=semop(semid,sb,1);                      /* semaphore operation */
  119.         if(ret == -1)
  120.         {
  121.                 ret=errno;
  122.                 if ( ret == EAGAIN )
  123.                 {
  124.                         return(3);                /* Can't do lock action now */
  125.                 }
  126.                 else
  127.                 {
  128.                         return(errno);                /* Error */
  129.                 }
  130.         }
  131.         else if(ret == 0)
  132.         {
  133.                 return(0);                        /* Success */
  134.         }
  135.         else
  136.         {
  137.                 return(8);                        /* System Error */
  138.         }
  139. }


  140. /*----------------------*
  141. *     Start main       *
  142. *----------------------*/
  143. int main(argc,argv)
  144.         char *argv[];
  145. {
  146.         int        key,cnt,ret;
  147.         char        cmd[255];
  148.         char        opt[255];

  149.         strcpy(cmd,argv[1]);
  150.         key=atoi(argv[2]);
  151.         cnt=atoi(argv[3]);

  152.         if(strcmp(cmd,"-s") == 0)
  153.         {
  154.                 ret=sem_del(key);
  155.                 if(ret != 0 && ret != 10)
  156.                 {
  157.                         exit(ret);
  158.                 }
  159.                 ret=sem_set(key,cnt);
  160.         }
  161.         else if (strcmp(cmd,"-l") == 0 || strcmp(cmd,"-u") == 0)
  162.         {
  163.                 strcpy(opt,argv[3]);
  164.                 ret=sem_landu(cmd,key,opt);
  165.         }
  166.         else if (strcmp(cmd,"-c") ==0)
  167.         {
  168.                 ret=sem_checkval(key);
  169.         }
  170.         else if (strcmp(cmd,"-d") ==0)
  171.         {
  172.                 ret=sem_del(key);
  173.                 if (ret == 10)
  174.                 {
  175.                         ret=1;
  176.                 }
  177.         }
  178.         else
  179.         {
  180.                 ret=9;                        /* Unsupported command(argv1) */
  181.         }

  182.         exit(ret);
  183. }

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP