- 论坛徽章:
- 0
|
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/file.h>
#include <pthread.h>
int fdd = -1;
void lockk()
{
if ( fdd == -1 )
return;
printf("fd %d\n", fdd);
struct flock lock;
lock.l_type = F_WRLCK;
/*lock.l_type = F_RDLCK;*/
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0;
lock.l_pid = -1;
if ( fcntl(fdd, F_SETLKW, &lock) == -1)
{
printf("Lock1 err\n", strerror(errno));
}
}
void unlockk()
{
if( fdd == -1 )
return;
printf("fd %d\n", fdd);
struct flock lock;
lock.l_type = F_UNLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0;
lock.l_pid = -1;
if ( fcntl(fdd, F_SETLK, &lock) == -1)
{
printf("Lock1 err\n", strerror(errno));
}
}
int main(int argc, char * argv[])
{
fdd = open("/root/lltest", O_CREAT | O_RDWR);
lockk();
printf("locked\n");
printf("lock %d\n", getpid());
sleep(40);
unlockk();
printf("unlocked\n");
return -1;
} |
上面的代码编译成两个程序lockrd,lockw.区别在lock.l_type,一个加读锁,一个加写锁。
按下面顺序执行程序
lockrd
lockw
lockrd
lockrd
lockrd
lockrd
lockrd
结果显示lockw一直阻塞,直到最后一个lockrd进程解锁后lockw才得以加锁,这样岂不是会饿死写锁?
有没有人遇到同样的问题啊,请多指教!! |
|