| 网站首页 | JAVA文章 | AppServers | Web开发 | 应用开发 | 资源下载 | 论坛
    想学好编程,学好外语很重要  [enadd  2006年12月25日]        
设为首页 加入收藏 联系站长
您现在的位置: 编程笔记网 >> 应用开发 >> vc >> 平台系统 >> 文章正文
多进程编程的相关知识总结(三)        【字体:
多进程编程的相关知识总结(三)
作者:-    文章来源:-    点击数:    更新时间:2006-4-20

23.semop()
        功能:信号量操作.
        语法:#include <sys/types.h>
             #include <sys/ipc.h>
             #include <sys/sem.h>
             int semop(semid,sops,nsops)
             int semid;
             struct sembuf *sops;
             unsigned nsops;
        说明:本系统调用用于执行用户定义的在一组信号量上操作的行为集合.

             该组信号量与semid相关.
             参数sops为一个用户定义的信号量操作结构数组指针.
             参数nsops为该数组的元素个数.
             数组的每个元素结构包括如下成员:
               sem_num;    /* 信号量数 */
               sem_op;     /* 信号量操作 */
               sem_flg;    /* 操作标志 */
             由本系统调用定义的每个信号量操作是针对由semid和sem_num指

             定的信号量的.变量sem_op指定三种信号量操作的一种:
             . 若sem_op为一负数并且调用进程具有修改权限,则下列情况之
               一将会发生:
               * 若semval不小于sem_op的绝对值,则sem_op的绝对值被减去
                 semval的值.若(semflg&SEM_UNDO)为真则sem_op的绝对值加

                 上调用进程指定的信号量的semadj值.
               * 若semval小于sem_op的绝对值同时(semflg&IPC_NOWA99v)为
                 真,则本调用立即返回.
               * 若semval小于sem_op的绝对值同时(semflg&IPC_NOWA99v)为
                 假,则本系统调用将增加指定信号量相关的semncnt值(加一),

                 将调用进程挂起直到下列条件之一被满足:
                   (1).semval值变成不小于sem_op的绝对值.当这种情况发
                       生时,指定的信号量相关的semncnt减一,若
                       (semflg&SEM_UNDO)为真则sem_op的绝对值加上调用
                       进程指定信号量的semadj值.
                   (2).调用进程等待的semid已被系统删除.
                   (3).调用进程捕俘到信号,此时,指定信号量的semncnt值
                       减一,调用进程执行中断服务程序.
             . 若sem_op为一正值,同时调用进程具有修改权限,sem_op的值加

               上semval的值,若(semflg&SEM_UNDO)为真,则sem_op减去调用
               进程指定信号量的semadj值.
             . 若sem_op为0,同时调用进程具有读权限,下列情况之一将会发
               生:
               * 若semval为0,本系统调用立即返回.
               * 若semval不等于0且(semflg&IPC_NOWA99v)为真,本系统调用
                 立即返回.
               * 若semval不等于0且(semflg&IPC_NOWA99v)为假,本系统调用
                 将把指定信号量的
                 semzcnt值加一,将调用进程挂起直到下列情况之一发生:
                   (1).semval值变为0时,指定信号量的semzcnt值减一.
                   (2).调用进程等待的semid已被系统删除.
                   (3).调用进程捕俘到信号,此时,指定信号量的semncnt值
                       减一,调用进程执行中断服务程序.
        返回值:调用成功则返回0,否则返回-1.
        例子:本例将包括上述信号量操作的所有系统调用:
             #include <sys/types.h>
             #include <sys/ipc.h>
             #include <sys/sem.h>
             #define SEMKEY 75
             int semid;
             unsigned int count;
             /*在文件sys/sem.h中定义的sembuf结构
              *  struct sembuf {
              *      unsigned short sem_num;
              *      short sem_op;
              *      short sem_flg;
              *  }*/
             struct sembuf psembuf,vsembuf;   /*P和V操作*/
             cleanup()
             {
                 semctl(semid,2,IPC_RMID,0);
                 exit(0);
             }
             main(argc,argv)
             int argc;
             char *argv[];
             {
                 int i,first,second;
                 short initarray[2],outarray[2];
                 extern cleanup();
                 if (argc==1) {
                     for (i=0;i<20;i++)
signal(i,clearup);
semid=semget(SEMKEY,2,0777|IPC_CREAT);
initarray[0]=initarray[1]=1;
semctl(semid,2,SETALL,initarray);
semctl(semid,2,GETALL,outarray);
printf("sem init vals %d%d \n",
outarray[0],outarray[1])

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] 下一页  

文章录入:enadd    责任编辑:enadd 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
  • 利用底层键盘钩子屏蔽任意按…

  • 深入剖析MFC中Windows消息处…

  • VC++中进程与多进程管理的方…

  • Window 消息大全使用详解

  • 关于键盘输入

  • Windows多线程多任务设计初步

  • VC++实现Win2000下直接读写磁…

  • 多进程编程的相关知识总结(…

  • 图形显示CPU内存利用率

  • Win32环境下dll编程原理

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 |