O_APPEND:原子操作

当多个进程打开同一个文件写入日志的时候,OPEN时指定了O_APPEND参数,UNIX能保证这个操作是原子的,程序不需要自己加锁

/*log1.c*/

#include<stdio.h>

#include<string.h>

#include<fcntl.h>

#include<unistd.h>



int Max = 300;

int main()

{

    int i;

    int fd;

    fd = open("1.log",O_WRONLY | O_APPEND);

    for(i=0;i<Max;i++)

    {

        char msg[100];

        sprintf(msg,"log1: message %d...\n",i);

        sleep(1);//让CPU调度走

        write(fd,msg,strlen(msg));

        write(STDOUT_FILENO,msg,strlen(msg));

    }

    close(fd);

    return 0;    

}

 

/*log2.c*/

#include<stdio.h>

#include<string.h>

#include<fcntl.h>

#include<unistd.h>



int Max = 300;

int main()

{

    int i;

    int fd;

    fd = open("1.log",O_WRONLY | O_APPEND);

    for(i=0;i<Max;i++)

    {

        char msg[100];

        sprintf(msg,"log2: message %d...\n",i);

        sleep(1);//让CPU调度走

        write(fd,msg,strlen(msg));

        write(STDOUT_FILENO,msg,strlen(msg));

    }

    close(fd);

    return 0;    

}

 

/*log3.c*/

#include<stdio.h>

#include<string.h>

#include<fcntl.h>

#include<unistd.h>



int Max = 300;

int main()

{

    int i;

    int fd;

    fd = open("2.log",O_WRONLY);

    for(i=0;i<Max;i++)

    {

        char msg[100];

        sprintf(msg,"log3: message %d...\n",i);

        lseek(fd,0,SEEK_END);

        sleep(1);//让CPU调度走

        write(fd,msg,strlen(msg));

        write(STDOUT_FILENO,msg,strlen(msg));

    }

    close(fd);

    return 0;    

}

 

/*log4.c*/

#include<stdio.h>

#include<string.h>

#include<fcntl.h>

#include<unistd.h>



int Max = 300;

int main()

{

    int i;

    int fd;

    fd = open("2.log",O_WRONLY);

    for(i=0;i<Max;i++)

    {

        char msg[100];

        sprintf(msg,"log4: message %d...\n",i);

        lseek(fd,0,SEEK_END);

        sleep(3);//让CPU调度走

        write(fd,msg,strlen(msg));

        write(STDOUT_FILENO,msg,strlen(msg));

    }

    close(fd);

    return 0;    

}

 

你可能感兴趣的:(append)