linux管道通信 加锁,Linux高级进程间通信:纪录锁

加锁与解锁

/* lockit---demonstration of fcntl locking */

#include

#include

#include

#include

int main(void)

{

int fd;

struct flock my_lock;

/*set the parameters for the write lock*/

my_lock.l_type=F_WRLCK;

my_lock.l_whence=SEEK_SET;

my_lock.l_start=0;

my_lock.l_len=10;

/* open file */

fd=open("locktest",O_RDWR);

/*lock first ten bytes */

if(fcntl(fd,F_SETLKW,&my_lock)==-1)

{

perror("parent:locking");

exit(1);

}

printf("parent:locked record /n");

switch(fork())

{

case -1:

perror("fork");

exit(1);

case 0:

my_lock.l_len=5;

if(fcntl(fd,F_SETLKW,&my_lock)==-1)

{

perror("child:locking");

exit(1);

}

printf("child:locked/n");

printf("child:exiting/n");

exit(0);

}

sleep(5);

/*now parent releases lock before exiting */

printf("parent:unlocking/n");

my_lock.l_type=F_UNLCK;

if(fcntl(fd,F_SETLK,&my_lock)==-1)

{

perror("parent:unlocking");

exit(1);

}

/* now parent exiting */

printf("parent:exiting/n");

exit(0);

}

/*

jiang@jiang-linux:~/unixprog/2011322$ gcc lookit.c -o lookit;./lookit

parent:locked record

parent:unlocking

parent:exiting

child:locked

child:exiting

*/

父子进程相互等待,进入死锁状态

#include

#include

#include

#include

int main(void)

{

int fd;

struct flock first_lock;

struct flock second_lock;

first_lock.l_type=F_WRLCK;//write lock

first_lock.l_whence=SEEK_SET;

first_lock.l_start=0;

first_lock.l_len=10;

second_lock.l_type=F_WRLCK;

second_lock.l_whence=SEEK_SET;

second_lock.l_start=0;

second_lock.l_len=10;

fd=open("locktest",O_RDWR);

if(fcntl(fd,F_SETLKW,&first_lock)==-1)

{

fatal("first_lock");

}

printf("lock succeeded (proc %d )/n",getpid());

switch(fork())

{

case -1:

/*error*/

fatal("fork call");

case 0:

/*child*/

if(fcntl(fd,F_SETLKW,&second_lock)==-1)//second lock

{

fatal("second lock");

}

printf("second lock succeeded (proc%d)/n",getpid());

if(fcntl(fd,F_SETLKW,&second_lock)==-1) //first lock

{

fatal("second lock");

}

default:

/*parent*/

printf("parent sleeping/n");

sleep(5);

if(fcntl(fd,F_SETLKW,&second_lock)==-1)//lock child's lock

{

fatal("child lock second lock:child already lock");

}

printf("second lock succeeded (proc %d)/n",getpid());

}

}

int fatal(char *s)

{

perror(s);

exit(1);

}

/*进入死锁状态了,似乎系统并不会自动检测2个死锁的。

jiang@jiang-linux:~/unixprog/2011322$ gcc deadlock.c -o deadlock.o;./deadlock.o

lock succeeded (proc 3023 )

parent sleeping

second lock succeeded (proc 3023)

second lock succeeded (proc3024)

parent sleeping

jiang@jiang-linux:~/unixprog/2011322$ second lock succeeded (proc 3024)

^C

*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值