- 论坛徽章:
- 1
|
信号灯建立后,锁定它没有反应,直到我将informix关闭后才执行
我怀疑你是不是没有搞清楚信号灯是怎么回事?
恕我冒昧,给你贴一个 demo 程序,希望对你有用:
- 这个例子演示了信号量的一种用法, 即利用信号量实现资源的互斥访问.
- 例子使用方法:
- $ one & another
- 程序 one.c 首先建立一个信号量集合, 其中包含了一个信号量, 然后调用
- semop( semid, &FREE, 1 );
- 使资源可用. 接下来是一个循环处理 ---- 这是许多后台进程的典型结构 ---- 用来代表反复的对这个资源的访问请求. 在这个循环中, 每次访问资源前首先使用语句
- semop( semid, &GET, 1 );
- 获得对资源的使用权(注1), 然后开始访问资源, 访问完毕后释放(注2).
- 程序 another.c 代表另外一个与 one.c 竞争使用互斥资源的进程, 它的流程与 one.c 完全相同.
- 注1: 这是书本中的说法, 就我理解, 该语句实际上只是将信号量的 semval 减一, 由于这两个程序的流程的特点, 该操作也就是将 semval 置为零. 换句话说, "获得使用权" 实际上是建立在 "自觉" 的基础上的, 即使是你将 semval 置为零, 互斥资源仍然可以访问.
- 由于当 semval 为零时 semop( semid, &GET, 1 ) 调用将导致进程阻塞, 所以实现了 "当资源正被另一个进程使用(semval=0)时, 请求互斥使用资源的进程将等待(阻塞)".
- 注2: 也就是将 semval 加一, 使之可用.
- 总的来说, 信号量实现了一个原子性的操作, 从而使程序之间的协调变得格外容易.
复制代码- .c.o:
- cc -c $<
- All: TestSem clean
- main: main.o
- cc -o main main.o
- TestSem: one another
- one: one.o
- cc -o one one.o
- another: another.o
- cc -o another another.o -l curses
- clean:
- if [ -f *.o ]; then rm *.o; fi
复制代码- //
- // filename: one.c
- // writer: flw
- //
- # include <unistd.h>;
- # include <stdio.h>;
- # include <sys/ipc.h>;
- # include <sys/sem.h>;
- struct sembuf GET = { 0, -1, SEM_UNDO };
- struct sembuf FREE = { 0, 1, SEM_UNDO };
- struct sembuf TEST = { 0, 0, SEM_UNDO };
- void main( void )
- {
- int semid, ret;
- key_t key;
- key = ftok( "/", 'J' );
- if ( key == -1 )
- {
- fprintf( stderr, "Ftok() Failed!\n" );
- return;
- }
- semid = semget( key, 1, IPC_CREAT | 0666 );
- if ( semid == -1 )
- {
- fprintf( stderr, "Semget() Failed!\n" );
- return;
- }
-
- fprintf( stderr, "One Begin...\n" );
- semop( semid, &FREE, 1 );
- while(1)
- {
- semop( semid, &GET, 1 );
- fprintf( stderr, "one: 开始访问资源!\n" );
- sleep( 1 );
- // 访问互斥资源
- fprintf( stderr, "one: 资源访问结束!\n" );
- semop( semid, &FREE, 1 );
- sleep( 2 );
- }
- }
复制代码- //
- // filename: another.c
- // writer: flw
- //
- # include <unistd.h>;
- # include <stdio.h>;
- # include <sys/ipc.h>;
- # include <sys/sem.h>;
- # include <curses.h>;
- struct sembuf TEST = { 0, 0, SEM_UNDO };
- struct sembuf GET = { 0, -1, SEM_UNDO };
- struct sembuf FREE = { 0, 1, SEM_UNDO };
- void main( void )
- {
- int semid, ret;
- key_t key;
- key = ftok( "/", 'J' );
- if ( key == -1 )
- {
- fprintf( stderr, "Ftok() Failed!\n" );
- return;
- }
- semid = semget( key, 1, IPC_CREAT | 0666 );
- if ( semid == -1 )
- {
- fprintf( stderr, "Semget() Failed!\n" );
- return;
- }
-
- fprintf( stderr, "Another Begin...\n" );
- while(1)
- {
- sleep( 10 );
- semop( semid, &GET, 1 );
- fprintf( stderr, "another: 开始访问资源\n" );
- // 访问互斥资源
- sleep( 6 );
- fprintf( stderr, "another: 资源访问结束!\n" );
- semop( semid, &FREE, 1 );
- }
- }
复制代码 |
|