Posix有名信号量控制进程并发
1 动因
有些时侯需要同一个程序在某一个时刻只有一个在执行,即我们通常所说的排它性,Stevens的那本“进程间通信”的书给出了三种实现方式,我选了简单有效的一种,做了下面的一个测试用例.
2 测试用例程序代码
#include
#include
#include
#include
#define LOCK_FILE “pxsemlock”
void print(pid_t);
//定义Posix有名信号灯
sem_t *locksem;
//定义信号灯当前值
int val;
int main()
{
//打开一个信号灯, 初值设为1
locksem=sem_open(LOCK_FILE,O_CREAT,0644,1);
//*申请信号灯
sem_wait(locksem);
//调用共享代码段
print(getpid());
sleep(10);
//释放信号灯
sem_post(locksem);
printf(“I’m finished,my pid is %d\n”,getpid());
return 0;
//关闭信号灯
sem_close(locksem);
sem_unlink(LOCK_FILE);
exit(0);
}
void print(pid_t pid)
{
printf(“I get it,my pid is %d\n”,pid);
sem_getvalue(locksem,&val);
printf(“Now the value have %d\n”,val);
}
3 编译命令
gcc -o lockpxsem lockpxsem.c -lpthread
4 两个终端窗口测试及输出
窗口1:
./lockpxsem
I get it,my pid is 18910
Now the value have 0
I’m finished,my pid is 18910
窗口2:
./lockpxsem
I get it,my pid is 18918
Now the value have 0
I’m finished,my pid is 18918
窗口2的程序在窗口1释放信号灯之后才执行.
近期评论