当前位置:  技术问答>linux和unix

文件锁的使用问题。怎么没锁住啊?

    来源: 互联网  发布时间:2016-12-23

    本文导语:  /*********************************************************************************/ /* 文件锁的使用。 */ /********************************************************************************/ #include  #include  #include  #include  void * fun(void * arg) { FILE *fp; ...

/*********************************************************************************/
/*
文件锁的使用。

*/
/********************************************************************************/

#include 
#include 
#include 
#include 

void * fun(void * arg)
{
FILE *fp;
char buf[10] = "hello!";
char buf2[10] = {''};

printf("in pthread:%x %xn", getpid(), pthread_self());

if ((fp = fopen("1.txt", "w+")) == NULL)
{
printf("open error!n");
}

if (ftrylockfile(fp) != 0)
{
printf("flockfile error!n");
}

flockfile(fp);

fwrite(buf, sizeof (char), 7, fp);
rewind(fp);
fread(buf2, sizeof(char), 6, fp);

fputs(buf2, stdout);
//funlockfile(fp);

fclose(fp);

return (void *)0;
}

int main()
{
pthread_t tid;
int err;
FILE *fp;
char buf[10] = "hello!";
char buf2[10] = {''};

if ((err = pthread_create(&tid, NULL, fun, NULL)) != 0)
{
printf("pthread error!n");
}

if ((fp = fopen("1.txt", "w+")) == NULL)
{
printf("open error!n");
}

if (ftrylockfile(fp) != 0)
{
printf("flockfile error!n");
}

flockfile(fp);

fwrite(buf, sizeof (char), 7, fp);
rewind(fp);
fread(buf2, sizeof(char), 6, fp);

fputs(buf2, stdout);
//funlockfile(fp);

sleep(3); //如果主线程运行完了,子线程没运行完就结束了。

printf("in main:%x %xn", getpid(), pthread_self());
printf("%dn", pthread_equal(tid, pthread_self()));

fclose(fp);

return 0;
}

运行结果:
[root@localhost work1]# ./1
hello!in pthread:3653 b7f42b90
hello!in main:3653 b7f436c0
0
[root@localhost work1]# 

怎么没锁住啊?

|
#include 
#include 
#include 
#include 

void * fun(void * arg)
{
FILE *fp=(FILE*)arg;
char buf[20] = "fun hello!";
char buf2[20] = {''};

printf("in pthread:%x %xn", getpid(), pthread_self());

if (ftrylockfile(fp) != 0)
{
printf("flockfile error!n");
}

flockfile(fp);

fwrite(buf, sizeof(char), 20, fp);
rewind(fp);
fread(buf2, sizeof(char), 20, fp);

fputs(buf2, stdout);
//funlockfile(fp);

return (void *)0;
}

int main()
{
pthread_t tid;
int err;
FILE *fp;
char buf[20] = "main hello!";
char buf2[20] = {''};

if ((fp = fopen("1.txt", "w+")) == NULL)
{
printf("open error!n");
}

if ((err = pthread_create(&tid, NULL, fun, (void *)fp)) != 0)
{
  printf("pthread error!n");
  fclose(fp);
}

if (ftrylockfile(fp) != 0)
{
printf("flockfile error!n");
}
printf("file is unlockn");

flockfile(fp);

printf("file cand been lockedn");
fwrite(buf, sizeof (char), 20, fp);
rewind(fp);
fread(buf2, sizeof(char), 20, fp);

fputs(buf2, stdout);
//funlockfile(fp);

sleep(3); //如果主线程运行完了,子线程没运行完就结束了。

printf("in main:%x %xn", getpid(), pthread_self());
printf("%dn", pthread_equal(tid, pthread_self()));

fclose(fp);

return 0;
}

简单给你调了一下:如上代码,程序运行时由于主线程需要等待子线程解锁,因此主线程会一直停留在
printf("file is unlockn");

flockfile(fp);

1.txt中会write进去的数据为:fun hello!即子进程的输入。父进程在等待解锁,所以数据无法写入的。
后续你需要将锁解开,让程序进入正常运行状态。
否则此程序就挂到等锁得状态,会出现死锁。


|
我不理解你为了测试文件锁而代码这样写: 一个线程和一个主控线程 文件被打开两次  也就是说在同一个进程中 文件打开两次 你看我的测试代码 也许可以帮助你理解文件锁

#include
#include
#include
#include
#include
#include
#include
#define MODE S_IRUSR|S_IWUSR

void out_file(int fd,char *s);

struct flock flockbuff;

int main(int argc,char *argv[])
{
if(argc 

    
 
 

您可能感兴趣的文章:

  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • 在ACC变成中要使用发ftp传送文件,但文件名不确定,请问怎么样在程序的FTP中使用字符串变量???
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • qemu使用的img文件和vm使用的img文件格式不同吗?
  • linux/Centos/ubuntu下如何使用umask命令修改新建文件时的默认权限
  • 为什么使用cat输出的文本文件是中文的,使用java从文件读取出来时显示的是乱码?
  • 怎样使用FTP递归获取文件夹下的所有文件及子文件夹?
  • GUI问题:如何使用文件选择对话框保存文本文件,图像文件??
  • linux下用什么命令使用怎样使用*.bin文件?
  • 急问:在linux里面怎么察看一个文件夹或文件有哪些用户在使用?
  • *.taz文件是什么文件?如何使用?
  • 使用TCP传输文件,文件传输成功了,大小也一样,但无法打开
  • 有没有办法在打开一个文件之前判断当前是否有进程在使用(读或写)该文件
  • 急!!求教linux命令的使用:统计出/bin目录中文件的个数,追加到文件filea的结尾
  • 高手请进:linux下使用.o文件,makefile文件的问题
  • linux下静态库使用:"未使用链接器输入文件,因为链接尚未完成"
  • vim生成的.cpp~是什么文件?我使用vim编辑的时候出现了好多.cpp~文件
  • *.db文件使用什么数据库打开的文件呀?
  • 如何使用arm-uclibc-gcc将.c文件编译生成.a,将.c文件编译生成.cgi?
  • 几台机器做lvs,使用100M 网线连接,文件系统使用NFS共享,读写速度会出现问题吗?
  • 请教高手一个简单问题:给定一个文件名,如何去查找该文件正在被几个程序使用,并怎么样才可以切断这个文件与正在打开该文件的程序之间的
  • 修改配置真正解决php文件上传大小限制问题(nginx+php)
  • 菜问题:请问如何根据文件中的一段内容查找文件路径和文件名称,在线等候
  • 修改配置真正解决php文件上传大小限制问题(apache+php)
  • shell脚本剪切文件文件,并生成新文件的问题
  • 文件编码及UTF-8、BOM、0XFEFF相关问题
  • 不解,上传文件后压缩文件的中文文件名问题,转码也不管用?
  • Java读写包括中文的txt文件时不同编码格式问题解决
  • ext3文件系统问题:文件在硬盘上的物理位置,一组文件要据此排序。
  • cocos2d中CCSpriteFrameCache文件同时存在两个plist的问题解决
  • jsp文件访问jar文件,路径问题。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ I/O 成员 eof():如果处于文件结尾处则返回true
  • Shell脚本如何递归现实一个文件夹中的文件(文件夹中含有文件夹)
  • WinDows8最新版文件夹加密
  • 求命令:什么命令可以把文件夹下所有的文件按修改时间先后排出来,包括子文件夹里的文件。
  • python异常信息堆栈输出到日志文件
  • [提问]Linux下如何把多个.a文件编译一个.so文件,或者把多个.so文件编译成一个.so文件
  • Centos6下安装Shell下文件上传下载rz,sz命令
  • 请问:proc中的头文件中能包含头文件吗?(感觉如果头文件中包含头文件的话,在链接时就会有错误啊)
  • 在MyEclipse中设开启xml文件自动提示和自动完成功能
  • 我要实现当进程打开文件时,根据文件名判断是否符合要求,符合后处理文件,再把文件返回给进程,怎么实现啊
  • MyEclipse如何查看和设置文件编码格式相关操作
  • vi 中编辑两个文件,怎样从其中一个文件拷一段内容到另一个文件中。(同时打开两个文件)
  • 设置sharepoint 2010文档库中的 pdf文件在浏览器中访问的打开方式
  • 怎么统计一个文件夹下有多少个文件(不包括文件夹)
  • windows/windows 7/windows 8 下打开查看、修改及保存超大(GB级)文本文件及其它类型文件的工具-PilotEdit
  • linux 下的 .a 文件 .o 文件 是什么文件?各有什么作用?
  • Linux_centos_redhat下tar命令解压tgz文件方法
  • 如何用socket一次传输多个文件,如何确定文件一个文件结束
  • c#如何生成Excel(.xls和.xlsx)文件
  • 如何删除某个目录下除了指定文件夹之外的所有文件和文件夹
  • 根据文件大小查找文件的find命令举例(Linux,centos,redhat)
  • solaris文件系统删除文件后文件夹大小不变


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3