# 作業系統實驗 Lab13

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
 
struct flock* file_lock(short type,short whence)
{
    static struct flock ret;
    ret.l_type = type;
    ret.l_start = 0;
    ret.l_whence = whence;
    ret.l_len = 0;
    ret.l_pid = getpid();
    return &ret;
}
 
int main()
{
    printf("1.exclusive lock(write lock)\n");
    printf("2.share lock(read lock)\n");
    printf("Choose lock type -> ");
    int ia;
    scanf("%d",&ia);
    int fd = open("lock.txt",O_RDWR|O_APPEND);
    //printf("fd = %d\n",fd);
    if(ia==1)
    {
        if(fcntl(fd, F_SETLK, file_lock(F_WRLCK, SEEK_SET))==0)
            printf("F_WRLCK success.\n");
        else
        {
            printf("F_WRLCK fail.\n");
            return 0;
        }
    }
    else
    {
        if(fcntl(fd, F_SETLK, file_lock(F_RDLCK, SEEK_SET))==0)
            printf("F_RDLCK success.\n");
        else
        {
            printf("F_RDLCK fail.\n");
            return 0;
        }
    }
    ia= 0;
    do
    {
        printf("If you want to unlock file and end program,\n");
        printf("please input 1 -> \n");
        scanf("%d",&ia);
    }while(ia!=1);
    fcntl(fd, F_SETLK, file_lock(F_UNLCK, SEEK_SET));
    close(fd);
}
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>

struct flock* file_lock(short type,short whence)
{
    static struct flock ret;
    ret.l_type = type;
    ret.l_start = 0;
    ret.l_whence = whence;
    ret.l_len = 0;
    ret.l_pid = getpid();
    return &ret;
}

int main()
{
    printf("1.exclusive lock(write lock)\n");
    printf("2.share lock(read lock)\n");
    printf("3.not use lock\n");
    printf("Choose lock type -> ");
    int ia;
    scanf("%d",&ia);
    int fd = open("lock.txt",O_RDWR|O_APPEND);
    if(ia==1)
    {
        if(fcntl(fd, F_SETLK, file_lock(F_WRLCK, SEEK_SET))!=0)
            printf("F_WRLCK fail.\n");
        else
            printf("F_WRLCK success.\n");
    }
    else if(ia==2)
    {
        if(fcntl(fd, F_SETLK, file_lock(F_RDLCK, SEEK_SET))!=0)
            printf("F_RDLCK fail.\n");
        else
            printf("F_RDLCK success.\n");
    }
    char ca[10000];
    if(read(fd, ca, 10000)<0)printf("Can't read file.\n");
    else
    {
        printf("Read file:\n");
        puts(ca);
    }
    strcpy(ca,"\n\nab write success.\n");
    if(write(fd, ca, strlen(ca))<0)printf("Can't write file.\n");
    else
    {
        printf("write file success.\n");
    }
    fcntl(fd, F_SETLK, file_lock(F_UNLCK, SEEK_SET));
    close(fd);
}
/*
mount /dev/sda1 /mnt
mount -o remount,mand /mnt
*/
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>

struct flock* file_lock(short type,short whence)
{
    static struct flock ret;
    ret.l_type = type;
    ret.l_start = 0;
    ret.l_whence = whence;
    ret.l_len = 0;
    ret.l_pid = getpid();
    return &ret;
}

int main()
{
    printf("1.exclusive lock(write lock)\n");
    printf("2.share lock(read lock)\n");
    printf("Choose lock type -> ");
    int ia;
    scanf("%d",&ia);
    int fd = open("mandlock.txt",O_RDWR|O_APPEND);
    //printf("fd = %d\n",fd);
    if(ia==1)
    {
        if(fcntl(fd, F_SETLK, file_lock(F_WRLCK, SEEK_SET))==0)
            printf("F_WRLCK success.\n");
        else
        {
            printf("F_WRLCK fail.\n");
            return 0;
        }
    }
    else
    {
        if(fcntl(fd, F_SETLK, file_lock(F_RDLCK, SEEK_SET))==0)
            printf("F_RDLCK success.\n");
        else
        {
            printf("F_RDLCK fail.\n");
            return 0;
        }
    }
    ia= 0;
    do
    {
        printf("If you want to unlock file and end program,\n");
        printf("please input 1 -> \n");
        scanf("%d",&ia);
    }while(ia!=1);
    fcntl(fd, F_SETLK, file_lock(F_UNLCK, SEEK_SET));
    close(fd);
}
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>

struct flock* file_lock(short type,short whence)
{
    static struct flock ret;
    ret.l_type = type;
    ret.l_start = 0;
    ret.l_whence = whence;
    ret.l_len = 0;
    ret.l_pid = getpid();
    return &ret;
}

int main()
{
    printf("1.exclusive lock(write lock)\n");
    printf("2.share lock(read lock)\n");
    printf("3.not use lock\n");
    printf("Choose lock type -> ");
    int ia;
    scanf("%d",&ia);
    int fd = open("mandlock.txt",O_RDWR|O_APPEND);
    if(ia==1)
    {
        if(fcntl(fd, F_SETLK, file_lock(F_WRLCK, SEEK_SET))!=0)
            printf("F_WRLCK fail.\n");
        else
            printf("F_WRLCK success.\n");
    }
    else if(ia==2)
    {
        if(fcntl(fd, F_SETLK, file_lock(F_RDLCK, SEEK_SET))!=0)
            printf("F_RDLCK fail.\n");
        else
            printf("F_RDLCK success.\n");
    }
    char ca[10000];
    if(read(fd, ca, 10000)<0)printf("Can't read file.\n");
    else
    {
        printf("Read file:\n");
        puts(ca);
    }
    strcpy(ca,"\n\nab write success.\n");
    if(write(fd, ca, strlen(ca))<0)printf("Can't write file.\n");
    else
    {
        printf("write file success.\n");
    }
    fcntl(fd, F_SETLK, file_lock(F_UNLCK, SEEK_SET));
    close(fd);
}