-
为什么要锁文件?
-
空洞文件的概念。建立一个下载任务。多线程并发。给文件的一块内容加上锁写文件 避免竞争。
-
意外解锁: 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);