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中的各种栈:进程栈 线程栈 内核栈 中断栈 栈的作用 1. 函数调用 2. 多任务支持 Linux 中有几种栈?各种栈的内存位置? 1. 进程栈 2. 线程栈 3. 进程内核栈 4. 中断栈 ...
- linux 线程id 进程id,在Linux上显示正在运行的进程的线程ID
在Linux上显示正在运行的进程的线程ID 在上Linux," ps -T"可以显示正在运行的进程的线程信息: # ps -T 2739 PID SPID TTY STAT TIM ...
- 内核和用户模式下进程与线程创建
文章目录 内核模式下进程与线程的创建 进程创建 线程创建 用户模式下进程与线程的创建 内核模式下进程与线程的创建 进程创建 在内核模式中,一个进程的创建是从函数NtCreateProcess开始的.该 ...
- linux 下进程和线程指定CPU运行
大概的介绍一下linux 的指定CPU运行,包括进程和线程,这个只是最基本的方法,看一下基本就会了,至于其他的进程间通信和线程同步的话,这里暂不做任何介绍. 算了,还是比较整体的介绍一下如何去学习这个 ...
- 关于linux下进程、线程和任务的一种阐述
进程在OS中是一个非常关键的抽象概念. 在OS中虚拟CPU称为执行线程,简称为线程. 用于创建和管理多执行线程的实用工具通常包含在一个pthread库.因为该库中接口是按照POSIX标准定义的,所 ...
- Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈
栈是什么?栈有什么作用? 首先,栈 (stack) 是一种串列形式的 数据结构.这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈顶 ...
- Linux学习之C语言的进程与线程编程
前言 继续Linux的学习,学到了Linux系统下的进程与线程的概念,布置了有关其的实验题,用C语言编程启动进程线程,习惯了Java多线程编程,这次在Linux下玩一玩C语言进程线程编程. 本文原创, ...
- 一文读懂 | Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈
点击蓝字 关注我们 因公众号更改推送规则,请点"在看"并加"星标"第一时间获取精彩技术分享 来源于网络,侵删 栈是什么?栈有什么作用? 首先,栈 (stack) ...
- Linux中的进程、线程和文件描述符
说到进程,恐怕面试中最常见的问题就是线程和进程的关系了,那么先说一下答案: 在 Linux 系统中,进程和线程几乎没有区别 . Linux 中的进程就是一个数据结构,看明白就可以理解文件描述符.重定向 ...
最新文章
- sublime快捷键
- Hadoop3.0基础平台搭建(三节点),以及案例运行并使用python生成词云
- 重写equals所要遵守的约定
- wxpython滑动面板_wxPython Panel面板的用法
- VTK:PolyData之PointLocatorVisualization
- 学爬虫,需要掌握哪些Python基础?
- Linux C高级编程——文件操作之系统调用
- JShielder:一款自动化Linux服务器安全增强工具
- 昆仑mcgs 通讯控制台达B2伺服采用modbus rtu方式
- u 20ubuntu 安装 postfix_惠普ENVY 13-AQ0011TX(6QT48PA)笔记本安装win10教程图解
- 成为java架构师需要几年,详细说明
- 用 Web 技术为 Safari 编写扩展
- 径向渐变加阴影html,CSS径向渐变阴影 - 反转
- Android Studio 学习记录-图形定制
- FixedUpdate
- 我心爱的吉他坏了,心里像少了什么一样:(
- JDK1.8之Lambada表达式一
- 集成电路中的低功耗设计(一)
- split分割字符串(按两种符号分割)
- 【C++】%d,%05d,%-5d,%.5d的区分