免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3280 | 回复: 16
打印 上一主题 下一主题

信号灯建立后,锁定它没有反应,直到我将informix关闭后才执行 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-01-19 17:39 |只看该作者 |倒序浏览
//锁定信号灯
void P(int sem_set_id)
{
        struct sembuf sem_op;

        //等待信号灯, 直到它的数值非负数
        sem_op.sem_num = 0;
        sem_op.sem_op = -1;
        sem_op.sem_flg = 0;
        semop(sem_set_id, &sem_op, 1);
    printf("锁定信号灯";
}//end of P()

运行到semop(sem_set_id, &sem_op, 1);就没有反映了

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2003-01-19 17:55 |只看该作者

信号灯建立后,锁定它没有反应,直到我将informix关闭后才执行

你用的是什么系统?

论坛徽章:
0
3 [报告]
发表于 2003-01-19 18:00 |只看该作者

信号灯建立后,锁定它没有反应,直到我将informix关闭后才执行

sco unix 5.05

论坛徽章:
0
4 [报告]
发表于 2003-01-19 18:04 |只看该作者

信号灯建立后,锁定它没有反应,直到我将informix关闭后才执行

是不是其它地方使用了这个信号灯
然后没有释放呢

检查一政代码看看

论坛徽章:
0
5 [报告]
发表于 2003-01-19 18:08 |只看该作者

信号灯建立后,锁定它没有反应,直到我将informix关闭后才执行

如果是程序的其他地方调用了,不应该把INFORMIX关了就好了呀

论坛徽章:
0
6 [报告]
发表于 2003-01-19 18:11 |只看该作者

信号灯建立后,锁定它没有反应,直到我将informix关闭后才执行

//建立信号灯
        sem_set_id = semget(SEM_ID, 1, IPC_CREAT | 0600);
        if (sem_set_id == -1) {
                perror("main: semget";
                exit(1);
        }

        //设置信号灯的数值是 1
        sem_val.val = 1;
        rc = semctl(sem_set_id, 0, SETVAL, sem_val);
        if (rc == -1) {
                perror("main: semctl";
                exit(1);
        }

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2003-01-19 18:11 |只看该作者

信号灯建立后,锁定它没有反应,直到我将informix关闭后才执行

我怀疑你是不是没有搞清楚信号灯是怎么回事?
恕我冒昧,给你贴一个 demo 程序,希望对你有用:
  1. 这个例子演示了信号量的一种用法, 即利用信号量实现资源的互斥访问.

  2. 例子使用方法:
  3. $ one & another

  4. 程序 one.c 首先建立一个信号量集合, 其中包含了一个信号量, 然后调用

  5.         semop( semid, &FREE, 1 );

  6. 使资源可用. 接下来是一个循环处理 ---- 这是许多后台进程的典型结构 ---- 用来代表反复的对这个资源的访问请求. 在这个循环中, 每次访问资源前首先使用语句

  7.         semop( semid, &GET, 1 );

  8. 获得对资源的使用权(注1), 然后开始访问资源, 访问完毕后释放(注2).
  9. 程序 another.c 代表另外一个与 one.c 竞争使用互斥资源的进程, 它的流程与 one.c 完全相同.


  10. 注1:   这是书本中的说法, 就我理解, 该语句实际上只是将信号量的 semval 减一, 由于这两个程序的流程的特点, 该操作也就是将 semval 置为零. 换句话说, "获得使用权" 实际上是建立在 "自觉" 的基础上的, 即使是你将 semval 置为零, 互斥资源仍然可以访问.
  11.        由于当 semval 为零时 semop( semid, &GET, 1 ) 调用将导致进程阻塞, 所以实现了 "当资源正被另一个进程使用(semval=0)时, 请求互斥使用资源的进程将等待(阻塞)".

  12. 注2:   也就是将 semval 加一, 使之可用.

  13. 总的来说, 信号量实现了一个原子性的操作, 从而使程序之间的协调变得格外容易.
复制代码
  1. .c.o:
  2.         cc -c $<

  3. All:        TestSem clean

  4. main:        main.o
  5.         cc -o main main.o

  6. TestSem:        one another

  7. one:        one.o
  8.         cc -o one one.o

  9. another:        another.o
  10.         cc -o another another.o -l curses

  11. clean:
  12.         if [ -f *.o ]; then rm *.o; fi

复制代码
  1. //
  2. // filename: one.c
  3. // writer:   flw
  4. //

  5. # include <unistd.h>;
  6. # include <stdio.h>;
  7. # include <sys/ipc.h>;
  8. # include <sys/sem.h>;

  9. struct sembuf GET  = { 0, -1, SEM_UNDO };
  10. struct sembuf FREE = { 0,  1, SEM_UNDO };
  11. struct sembuf TEST = { 0,  0, SEM_UNDO };

  12. void main( void )
  13. {
  14.         int semid, ret;
  15.         key_t key;

  16.         key = ftok( "/", 'J' );
  17.         if ( key == -1 )
  18.         {
  19.                 fprintf( stderr, "Ftok() Failed!\n" );
  20.                 return;
  21.         }

  22.         semid = semget( key, 1, IPC_CREAT | 0666 );
  23.         if ( semid == -1 )
  24.         {
  25.                 fprintf( stderr, "Semget() Failed!\n" );
  26.                 return;
  27.         }
  28.        
  29.         fprintf( stderr, "One Begin...\n" );

  30.         semop( semid, &FREE, 1 );

  31.         while(1)
  32.         {
  33.                 semop( semid, &GET, 1 );
  34.                 fprintf( stderr, "one: 开始访问资源!\n" );
  35.                 sleep( 1 );
  36.                 // 访问互斥资源
  37.                 fprintf( stderr, "one: 资源访问结束!\n" );
  38.                 semop( semid, &FREE, 1 );
  39.                 sleep( 2 );
  40.         }
  41. }
复制代码
  1. //
  2. // filename: another.c
  3. // writer:   flw
  4. //

  5. # include <unistd.h>;
  6. # include <stdio.h>;
  7. # include <sys/ipc.h>;
  8. # include <sys/sem.h>;
  9. # include <curses.h>;

  10. struct sembuf TEST = { 0,  0, SEM_UNDO };
  11. struct sembuf GET  = { 0, -1, SEM_UNDO };
  12. struct sembuf FREE = { 0,  1, SEM_UNDO };

  13. void main( void )
  14. {
  15.         int semid, ret;
  16.         key_t key;

  17.         key = ftok( "/", 'J' );
  18.         if ( key == -1 )
  19.         {
  20.                 fprintf( stderr, "Ftok() Failed!\n" );
  21.                 return;
  22.         }

  23.         semid = semget( key, 1, IPC_CREAT | 0666 );
  24.         if ( semid == -1 )
  25.         {
  26.                 fprintf( stderr, "Semget() Failed!\n" );
  27.                 return;
  28.         }
  29.        
  30.         fprintf( stderr, "Another Begin...\n" );

  31.         while(1)
  32.         {
  33.                 sleep( 10 );
  34.                 semop( semid, &GET, 1 );
  35.                 fprintf( stderr, "another: 开始访问资源\n" );
  36.                 // 访问互斥资源
  37.                 sleep( 6 );
  38.                 fprintf( stderr, "another: 资源访问结束!\n" );
  39.                 semop( semid, &FREE, 1 );
  40.         }
  41. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2003-01-19 18:19 |只看该作者

信号灯建立后,锁定它没有反应,直到我将informix关闭后才执行

我原来是不太明白信号灯的原理,但是操作系统中的P V 操作我理解和这比较相似
能不能看看我的问题出在那里

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2003-01-19 18:23 |只看该作者

信号灯建立后,锁定它没有反应,直到我将informix关闭后才执行

[quote]原帖由 "zhoulongfei"]信号灯建立后,锁定它没有反应[/quote 发表:

什么叫“没有反应”?
拜托大哥把问题说清楚一点!

论坛徽章:
0
10 [报告]
发表于 2003-01-19 19:08 |只看该作者

信号灯建立后,锁定它没有反应,直到我将informix关闭后才执行

没有代码怎么看
检查一下

1  semget 得到
2  semctl  设置初始值

3 semop 操作
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP