不知道大家有没有碰到过这样的问题,即在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下进程和线程对文件的同步问题,请高手来看看!!!...相关推荐

  1. Linux中的各种栈:进程栈 线程栈 内核栈 中断栈

    Linux中的各种栈:进程栈 线程栈 内核栈 中断栈 栈的作用 1. 函数调用 2. 多任务支持 Linux 中有几种栈?各种栈的内存位置? 1. 进程栈 2. 线程栈 3. 进程内核栈 4. 中断栈 ...

  2. linux 线程id 进程id,在Linux上显示正在运行的进程的线程ID

    在Linux上显示正在运行的进程的线程ID 在上Linux," ps -T"可以显示正在运行的进程的线程信息: # ps -T 2739 PID SPID TTY STAT TIM ...

  3. 内核和用户模式下进程与线程创建

    文章目录 内核模式下进程与线程的创建 进程创建 线程创建 用户模式下进程与线程的创建 内核模式下进程与线程的创建 进程创建 在内核模式中,一个进程的创建是从函数NtCreateProcess开始的.该 ...

  4. linux 下进程和线程指定CPU运行

    大概的介绍一下linux 的指定CPU运行,包括进程和线程,这个只是最基本的方法,看一下基本就会了,至于其他的进程间通信和线程同步的话,这里暂不做任何介绍. 算了,还是比较整体的介绍一下如何去学习这个 ...

  5. 关于linux下进程、线程和任务的一种阐述

    进程在OS中是一个非常关键的抽象概念.  在OS中虚拟CPU称为执行线程,简称为线程.  用于创建和管理多执行线程的实用工具通常包含在一个pthread库.因为该库中接口是按照POSIX标准定义的,所 ...

  6. Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    栈是什么?栈有什么作用? 首先,栈 (stack) 是一种串列形式的 数据结构.这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈顶 ...

  7. Linux学习之C语言的进程与线程编程

    前言 继续Linux的学习,学到了Linux系统下的进程与线程的概念,布置了有关其的实验题,用C语言编程启动进程线程,习惯了Java多线程编程,这次在Linux下玩一玩C语言进程线程编程. 本文原创, ...

  8. 一文读懂 | Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    点击蓝字 关注我们 因公众号更改推送规则,请点"在看"并加"星标"第一时间获取精彩技术分享 来源于网络,侵删 栈是什么?栈有什么作用? 首先,栈 (stack) ...

  9. Linux中的进程、线程和文件描述符

    说到进程,恐怕面试中最常见的问题就是线程和进程的关系了,那么先说一下答案: 在 Linux 系统中,进程和线程几乎没有区别 . Linux 中的进程就是一个数据结构,看明白就可以理解文件描述符.重定向 ...

最新文章

  1. sublime快捷键
  2. Hadoop3.0基础平台搭建(三节点),以及案例运行并使用python生成词云
  3. 重写equals所要遵守的约定
  4. wxpython滑动面板_wxPython Panel面板的用法
  5. VTK:PolyData之PointLocatorVisualization
  6. 学爬虫,需要掌握哪些Python基础?
  7. Linux C高级编程——文件操作之系统调用
  8. JShielder:一款自动化Linux服务器安全增强工具
  9. 昆仑mcgs 通讯控制台达B2伺服采用modbus rtu方式
  10. u 20ubuntu 安装 postfix_惠普ENVY 13-AQ0011TX(6QT48PA)笔记本安装win10教程图解
  11. 成为java架构师需要几年,详细说明
  12. 用 Web 技术为 Safari 编写扩展
  13. 径向渐变加阴影html,CSS径向渐变阴影 - 反转
  14. Android Studio 学习记录-图形定制
  15. FixedUpdate
  16. 我心爱的吉他坏了,心里像少了什么一样:(
  17. JDK1.8之Lambada表达式一
  18. 集成电路中的低功耗设计(一)
  19. split分割字符串(按两种符号分割)
  20. 【C++】%d,%05d,%-5d,%.5d的区分

热门文章

  1. K-Means算法理论及Python实现
  2. LCS(最长公共子串)系列问题
  3. 复合五点高斯公式计算(Python实现)
  4. java代码如何降低重复率_影响网站跳出率的主要因素及如何降低网站跳出率?...
  5. 解决“element表单验证输入的数字检测出来是string”的问题
  6. Nginx的启动、停止与重启---linux
  7. Win强制删除文件windows批处理强行删除文件
  8. Mui Webview下来刷新上拉加载实现
  9. git修改文件权限方式
  10. [原] XAF 添加日期筛选下拉选择