linux进程同步问题,关于LINUX下进程和线程对文件的同步问题,请高手来看看!!!...
不知道大家有沒有碰到過這樣的問題,即在LINUX下的程序有時候會碰到多個進程訪問同一個文件,
以及一個進程的不同線程對一個文件的同步問題,我嘗試用了系統提供的fcntl函數來給文件加鎖,
但是這只是一個進程互斥鎖,對于多線程的訪問,后面的操作會覆蓋前面的,看了stevens大爺的
網絡編程的第9章中的my_lock和my_unlock的例子,還是不能很好的解決多線程同步的問題,
而他在11章利用信號燈對兩個函數的另一種實現在LINUX下不行,因為LINUX下不支持有名信號燈,
哪位大蝦能給提供一個比較好的解決方法,能給提供源代碼的(上面兩個函數的)我再加300分!
|
如果使用進程間同步,使用IPC(信號量(SYS-V)、消息隊列(SYS-V)、SOCKET)都行
如果使用線程同步,建議使用posix?信號量和消息隊列
這些都沒問題,如果不能實現文件互斥,那么最大可能是你設計的文件互斥邏輯可能存在問題
|
/*?recordio?*/
#include
#include
#include
#include
#include?"recordio.h"
int?initrecord(const?char*?pathname,?unsigned?int?reclen)
{
int?fd;
int?rs;
RECORDINFO?info;
if?(?(fd?=?open(pathname,?O_RDWR|O_CREAT,?0660))?==?-1?)?{
perror("Fail?to?open?file?for?initializing?record");
return?-1;
}
if?(?(rs?=?read(fd,?&info,?sizeof(RECORDINFO)))?==?-1?)?{
perror("Fail?to?read?record?info?for?initializing?record");
return?-1;
}
if?(?rs?==?0?)?{
info.reclen?=?reclen;
info.recnum?=?0;
if?(?write(fd,?&info,?sizeof(RECORDINFO))?==?-1?)?{
perror("Fail?to?write?record?info?for?initializing?record");
return?-1;
}
}
close(fd);
return?0;
}
int?addrecord(const?char*?pathname,?void*?buf,?unsigned?int?reclen,?unsigned?int?recnum)
{
int?fd;
int?rs;
struct?flock?lock;
lock.l_type?=?F_WRLCK;
lock.l_start?=?0;
lock.l_whence?=?SEEK_SET;
lock.l_len?=?0;
if?(?(fd?=?open(pathname,?O_WRONLY|O_APPEND))?==?-1?)?{
perror("Fail?to?open?file?for?adding?record");
return?-1;
}
if?(?fcntl(fd,?F_SETLKW,?&lock)?==?-1?)?{
perror("Fail?to?lock?file?for?adding?record");
return?-1;
}
lock.l_type?=?F_UNLCK;
rs?=?write(fd,?buf,?reclen?*?recnum);
if?(?fcntl(fd,?F_SETLKW,?&lock)?==?-1?)?{
perror("Fail?to?unlock?file?for?adding?record");
return?-1;
}
close(fd);
return?rs;
}
int?getrecord(const?char*?pathname,?void*?buf,?unsigned?int?reclen,?unsigned?int?recnum)
{
int?fd;
int?len;
RECORDINFO?info;
struct?flock?lock;
lock.l_type?=?F_WRLCK;
lock.l_start?=?0;
lock.l_whence?=?SEEK_SET;
lock.l_len?=?0;
if?(?(fd?=?open(pathname,?O_RDWR))?==?-1?)?{
perror("Fail?to?open?file?for?geting?record");
return?-1;
}
if?(?fcntl(fd,?F_SETLKW,?&lock)?==?-1?)?{
perror("Fail?to?lock?file?for?geting?record");
return?-1;
}
lock.l_type?=?F_UNLCK;
if?(?read(fd,?&info,?sizeof(RECORDINFO))?!=?sizeof(RECORDINFO)?)?{
perror("Fail?to?read?record?info");
return?-1;
}
if?(?info.reclen?!=?reclen?)?{
fprintf(stderr,?"Invalid?reclen?parameter?n");
return?-1;
}
if?(?lseek(fd,?sizeof(RECORDINFO)?+?info.reclen?*?info.recnum,?SEEK_SET)?==?-1?)?{
perror("Fail?to?seek?read?position");
return?-1;
}
if?(?(len?=?read(fd,?buf,?reclen?*?recnum))?==?-1?)?{
perror("Fail?to?get?record");
return?-1;
}
if?(?len?==?0?)?{
if?(?ftruncate(fd,?sizeof(RECORDINFO))?==?-1?)?{
perror("Fail?to?truncate?file");
return?-1;
}
info.recnum?=?0;
if?(?lseek(fd,?0,?SEEK_SET)?==?-1?)?{
perror("Fail?to?return?beginning");
return?-1;
}
if?(?write(fd,?&info,?sizeof(RECORDINFO))?==?-1?)?{
perror("Fail?to?update?record?info");
return?-1;
}
if?(?fcntl(fd,?F_SETLKW,?&lock)?==?-1?)?{
perror("Fail?to?unlock?file?for?geting?record");
return?-1;
}
close(fd);
return?0;
}?else?{
info.recnum?+=??len?/?info.reclen;
if?(?lseek(fd,?0,?SEEK_SET)?==?-1?)?{
perror("Fail?to?return?beginning");
return?-1;
}
if?(?write(fd,?&info,?sizeof(RECORDINFO))?==?-1?)?{
perror("Fail?to?update?record?info");
return?-1;
}
if?(?fcntl(fd,?F_SETLKW,?&lock)?==?-1?)?{
perror("Fail?to?unlock?file?for?geting?record");
return?-1;
}
close(fd);
return?len;
}
}
總結
以上是生活随笔為你收集整理的linux进程同步问题,关于LINUX下进程和线程对文件的同步问题,请高手来看看!!!...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 本金加利息计算公式
- 下一篇: linux编译项目的命令,Linux用m