当前位置: 技术问答>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;
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
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
#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