• 为什么要锁文件?

  • 空洞文件的概念。建立一个下载任务。多线程并发。给文件的一块内容加上锁写文件 避免竞争。

  • 意外解锁: inode-结构体-fd,加锁 体现在inode层面

lockf

int lockf(int fd,int cmd, off_t len);

F_TLOCK 非阻塞

  • 例子,二十个线程操作同一个文件 add.c,打开-取出-加一-取回去。多线程并发改为多进程并发。
#define PROCNUM  20
 
static void func_add(void)
{
	FILE *fp;
	fp=fopen(FNAME,"r+");
	if(fp==NULL)
	{
		perror("fopen()");
		exit(1);
	}
	fd=fileno(fp);
	/*if err*/
	
	//临界区
	lockf(fd,F_LOCK,0);//0 有多长锁多长
	fgets(linebuf,LINESIZE,fp);
	fseek(fp,0,SEEK_SET);
	sleep(1);
	fprintf(fp,"%d\n",atoi(linebuf)+1);
	fflush(fp);
	lockf(fd,F_ULOCK,0);
	fclose(fp);
	return ;
}
 
 
//main
 
for(i=0;i<PROCNUM;i++)
{
	pid=fork();
	if(pid<0)
	{
		perror("fork()");
		exit(1);
	}
	if(pid==0)
	{
	//子进程
		func_add();
		exit(0);
	}
}
 
for(i=0;i<PROCNUM;i++)
	wait(NULL);//只收尸,不关心状态
 
exit(0);