Linux高级进程间通信:纪录锁

加锁与解锁


/* lockit---demonstration of fcntl locking */
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>

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<stdlib.h>
#include<unistd.h>
#include<stdio.h>
#include<fcntl.h>

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值