c语言 两个程序对同一个文件读写

Banio 2017-03-29 09:42:37
如题
有两个程序会同事对同一个文件读写
程序1,打开文件的方式是open(r+),这个fp 常开,有内容呢,就顺序写入,为了防止程序2改完内容,会写重复的问题,每次write操作之前都会执行一次fseek(fp, 0, SEEK_END)

程序2,打开文件方式是open(w+),一次一调用的,就是为了改改文件内的内容

疑问是
问题1:1程序在执行写入的时候,2程序是没办法执行的吧?反过来 2程序执行的时候 1程序没办法执行写入?
问题2:这种方式会出现死锁什么的问题吗?例如程序1 已经写入完了,但是程序2 依然没办法执行
...全文
824 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 2017-03-29
  • 打赏
  • 举报
回复
赵4老师 2017-03-29
  • 打赏
  • 举报
回复
_sopen, _wsopen Open a file for sharing. int _sopen( const char *filename, int oflag, int shflag [, int pmode ] ); int _wsopen( const wchar_t *filename, int oflag, int shflag [, int pmode ] ); Routine Required Header Optional Headers Compatibility _sopen <io.h> <fcntl.h>, <sys/types.h>, <sys/stat.h>, <share.h> Win 95, Win NT _wsopen <io.h> or <wchar.h> <fcntl.h>, <sys/types.h>, <sys/stat.h>, <share.h> Win NT For additional compatibility information, see Compatibility in the Introduction. Libraries LIBC.LIB Single thread static library, retail version LIBCMT.LIB Multithread static library, retail version MSVCRT.LIB Import library for MSVCRT.DLL, retail version Return Value Each of these functions returns a file handle for the opened file. A return value of –1 indicates an error, in which case errno is set to one of the following values: EACCES Given path is a directory, or file is read-only, but an open-for-writing operation was attempted. EEXIST _O_CREAT and _O_EXCL flags were specified, but filename already exists. EINVAL Invalid oflag or shflag argument. EMFILE No more file handles available. ENOENT File or path not found. Parameters filename Filename oflag Type of operations allowed shflag Type of sharing allowed pmode Permission setting Remarks The _sopen function opens the file specified by filename and prepares the file for shared reading or writing, as defined by oflag and shflag. _wsopen is a wide-character version of _sopen; the filename argument to _wsopen is a wide-character string. _wsopen and _sopen behave identically otherwise. Generic-Text Routine Mappings TCHAR.H Routine _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined _tsopen _sopen _sopen _wsopen The integer expression oflag is formed by combining one or more of the following manifest constants, defined in the file FCNTL.H. When two or more constants form the argument oflag, they are combined with the bitwise-OR operator ( | ). _O_APPEND Repositions file pointer to end of file before every write operation. _O_BINARY Opens file in binary (untranslated) mode. (See fopen for a description of binary mode.) _O_CREAT Creates and opens new file for writing. Has no effect if file specified by filename exists. The pmode argument is required when _O_CREAT is specified. _O_CREAT | _O_SHORT_LIVED Create file as temporary and if possible do not flush to disk. The pmode argument is required when _O_CREAT is specified. _O_CREAT | _O_TEMPORARY Create file as temporary; file is deleted when last file handle is closed. The pmode argument is required when _O_CREAT is specified. _O_CREAT | _O_EXCL Returns error value if file specified by filename exists. Applies only when used with _O_CREAT. _O_NOINHERIT Prevents creation of a shared file handle. _O_RANDOM Specifies primarily random access from disk. _O_RDONLY Opens file for reading only; cannot be specified with _O_RDWR or _O_WRONLY. _O_RDWR Opens file for both reading and writing; cannot be specified with _O_RDONLY or _O_WRONLY. _O_SEQUENTIAL Specifies primarily sequential access from disk _O_TEXT Opens file in text (translated) mode. (For more information, see Text and Binary Mode File I/O and fopen.) _O_TRUNC Opens file and truncates it to zero length; the file must have write permission. You cannot specify this flag with _O_RDONLY. _O_TRUNC used with _O_CREAT opens an existing file or creates a new file. Warning The _O_TRUNC flag destroys the contents of the specified file. _O_WRONLY Opens file for writing only; cannot be specified with _O_RDONLY or _O_RDWR. To specify the file access mode, you must specify either _O_RDONLY, _O_RDWR, or _O_WRONLY. There is no default value for the access mode. The argument shflag is a constant expression consisting of one of the following manifest constants, defined in SHARE.H. _SH_DENYRW Denies read and write access to file _SH_DENYWR Denies write access to file _SH_DENYRD Denies read access to file _SH_DENYNO Permits read and write access The pmode argument is required only when you specify _O_CREAT. If the file does not exist, pmode specifies the file’s permission settings, which are set when the new file is closed the first time. Otherwise pmode is ignored. pmode is an integer expression that contains one or both of the manifest constants _S_IWRITE and _S_IREAD, defined in SYS\STAT.H. When both constants are given, they are combined with the bitwise-OR operator. The meaning of pmode is as follows: _S_IWRITE Writing permitted _S_IREAD Reading permitted _S_IREAD | _S_IWRITE Reading and writing permitted If write permission is not given, the file is read-only. Under Windows NT and Windows 95, all files are readable; it is not possible to give write-only permission. Thus the modes _S_IWRITE and _S_IREAD | _S_IWRITE are equivalent. _sopen applies the current file-permission mask to pmode before setting the permissions (see _umask). Example /* LOCKING.C: This program opens a file with sharing. It locks * some bytes before reading them, then unlocks them. Note that the * program works correctly only if the file exists. */ #include <io.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/locking.h> #include <share.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> void main( void ) { int fh, numread; char buffer[40]; /* Quit if can't open file or system doesn't * support sharing. */ fh = _sopen( "locking.c", _O_RDWR, _SH_DENYNO, _S_IREAD | _S_IWRITE ); if( fh == -1 ) exit( 1 ); /* Lock some bytes and read them. Then unlock. */ if( _locking( fh, LK_NBLCK, 30L ) != -1 ) { printf( "No one can change these bytes while I'm reading them\n" ); numread = _read( fh, buffer, 30 ); printf( "%d bytes read: %.30s\n", numread, buffer ); lseek( fh, 0L, SEEK_SET ); _locking( fh, LK_UNLCK, 30L ); printf( "Now I'm done. Do what you will with them\n" ); } else perror( "Locking failed\n" ); _close( fh ); } Output No one can change these bytes while I'm reading them 30 bytes read: /* LOCKING.C: This program ope Now I'm done. Do what you will with them Low-level I/O Routines See Also _close, _creat, fopen, _fsopen, _open _locking Locks or unlocks bytes of a file. int _locking( int handle, int mode, long nbytes ); Routine Required Header Optional Headers Compatibility _locking <io.h> and <sys/locking.h> <errno.h> Win 95, Win NT For additional compatibility information, see Compatibility in the Introduction. Libraries LIBC.LIB Single thread static library, retail version LIBCMT.LIB Multithread static library, retail version MSVCRT.LIB Import library for MSVCRT.DLL, retail version Return Value _locking returns 0 if successful. A return value of –1 indicates failure, in which case errno is set to one of the following values: EACCES Locking violation (file already locked or unlocked). EBADF Invalid file handle. EDEADLOCK Locking violation. Returned when the _LK_LOCK or _LK_RLCK flag is specified and the file cannot be locked after 10 attempts. EINVAL An invalid argument was given to _locking. Parameters handle File handle mode Locking action to perform nbytes Number of bytes to lock Remarks The _locking function locks or unlocks nbytes bytes of the file specified by handle. Locking bytes in a file prevents access to those bytes by other processes. All locking or unlocking begins at the current position of the file pointer and proceeds for the next nbytes bytes. It is possible to lock bytes past end of file. mode must be one of the following manifest constants, which are defined in LOCKING.H: _LK_LOCK Locks the specified bytes. If the bytes cannot be locked, the program immediately tries again after 1 second. If, after 10 attempts, the bytes cannot be locked, the constant returns an error. _LK_NBLCK Locks the specified bytes. If the bytes cannot be locked, the constant returns an error. _LK_NBRLCK Same as _LK_NBLCK. _LK_RLCK Same as _LK_LOCK. _LK_UNLCK Unlocks the specified bytes, which must have been previously locked. Multiple regions of a file that do not overlap can be locked. A region being unlocked must have been previously locked. _locking does not merge adjacent regions; if two locked regions are adjacent, each region must be unlocked separately. Regions should be locked only briefly and should be unlocked before closing a file or exiting the program. Example /* LOCKING.C: This program opens a file with sharing. It locks * some bytes before reading them, then unlocks them. Note that the * program works correctly only if the file exists. */ #include <io.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/locking.h> #include <share.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> void main( void ) { int fh, numread; char buffer[40]; /* Quit if can't open file or system doesn't * support sharing. */ fh = _sopen( "locking.c", _O_RDWR, _SH_DENYNO, _S_IREAD | _S_IWRITE ); if( fh == -1 ) exit( 1 ); /* Lock some bytes and read them. Then unlock. */ if( _locking( fh, LK_NBLCK, 30L ) != -1 ) { printf( "No one can change these bytes while I'm reading them\n" ); numread = _read( fh, buffer, 30 ); printf( "%d bytes read: %.30s\n", numread, buffer ); lseek( fh, 0L, SEEK_SET ); _locking( fh, LK_UNLCK, 30L ); printf( "Now I'm done. Do what you will with them\n" ); } else perror( "Locking failed\n" ); _close( fh ); } Output No one can change these bytes while I'm reading them 30 bytes read: /* LOCKING.C: This program ope Now I'm done. Do what you will with them File Handling Routines See Also _creat, _open
  • 打赏
  • 举报
回复
引用 5 楼 rtkgy 的回复:
[quote=引用 3 楼 q3733353520 的回复:] 你这个是多线程,还是真正2个程序?
真正的两个程序 不是多线程 [/quote] 那就是进程间通讯咯
Banio 2017-03-29
  • 打赏
  • 举报
回复
引用 4 楼 cfjtaishan 的回复:
[quote=引用 2 楼 rtkgy 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 程序1写入的时候写的内容还在内存里,不在文件里,所以程序2读不到内容; 当文件关闭或程序退出时,内存的数据才会刷到(磁盘或flash)文件里,还有可以通过每次强制刷到文件里。 如果是两个程序需要通讯,建议走进程间通信,当然这个需要运用进程间通信的知识,需要注意一个同步。
1.程序写入完会执行fflush 写入进去的 2.这样的情况需要进程通信吗,做到俩个互不干扰就行[/quote] 你的程序都是写吗?[/quote] 程序2 是先读一下在写 先fopen(r+)把里面内容读出来 内容会处理一下 然后fclose 在fopen(w+)清空一下 在把处理的内容写回去 就是这么个流程 也需要程序2执行的时候 程序1 不在执行
Banio 2017-03-29
  • 打赏
  • 举报
回复
引用 3 楼 q3733353520 的回复:
你这个是多线程,还是真正2个程序?
真正的两个程序 不是多线程
自信男孩 2017-03-29
  • 打赏
  • 举报
回复
引用 2 楼 rtkgy 的回复:
[quote=引用 1 楼 cfjtaishan 的回复:] 程序1写入的时候写的内容还在内存里,不在文件里,所以程序2读不到内容; 当文件关闭或程序退出时,内存的数据才会刷到(磁盘或flash)文件里,还有可以通过每次强制刷到文件里。 如果是两个程序需要通讯,建议走进程间通信,当然这个需要运用进程间通信的知识,需要注意一个同步。
1.程序写入完会执行fflush 写入进去的 2.这样的情况需要进程通信吗,做到俩个互不干扰就行[/quote] 你的程序都是写吗?
  • 打赏
  • 举报
回复
你这个是多线程,还是真正2个程序?
Banio 2017-03-29
  • 打赏
  • 举报
回复
引用 1 楼 cfjtaishan 的回复:
程序1写入的时候写的内容还在内存里,不在文件里,所以程序2读不到内容; 当文件关闭或程序退出时,内存的数据才会刷到(磁盘或flash)文件里,还有可以通过每次强制刷到文件里。 如果是两个程序需要通讯,建议走进程间通信,当然这个需要运用进程间通信的知识,需要注意一个同步。
1.程序写入完会执行fflush 写入进去的 2.这样的情况需要进程通信吗,做到俩个互不干扰就行
自信男孩 2017-03-29
  • 打赏
  • 举报
回复
程序1写入的时候写的内容还在内存里,不在文件里,所以程序2读不到内容; 当文件关闭或程序退出时,内存的数据才会刷到(磁盘或flash)文件里,还有可以通过每次强制刷到文件里。 如果是两个程序需要通讯,建议走进程间通信,当然这个需要运用进程间通信的知识,需要注意一个同步。
Banio 2017-03-29
  • 打赏
  • 举报
回复
引用 7 楼 q3733353520 的回复:
[quote=引用 5 楼 rtkgy 的回复:] [quote=引用 3 楼 q3733353520 的回复:] 你这个是多线程,还是真正2个程序?
真正的两个程序 不是多线程 [/quote] 那就是进程间通讯咯[/quote] 看错了 两个不同的程序调用的同一个so库 去对这一个文件写入........
纯c读写ini配置文件 用c/c++读写ini配置文件有不少第三方的开源库,如iniparser、libini、rwini、UltraLightINIParser等,但都不理想,往往代码较大、功能较弱、 接口使用不方便。尤其在大小写处理、前后空格、各种注释、跨平台换行符支持、带引号字符串处理、无section操作、原格式保持等方面存在问题。 现将本人精心制作的ini读写程序源码奉献给大家,纯c编写,简洁好用。支持windows和linux。 主要特点: 1、支持;和#注释符号,支持行尾注释。 2、支持带引号'或"成对匹配的字符串,提取时自动去引号。引号中可带其它引号或;#注释符。 3、支持无section或空section(名称为空)。 4、支持10、16、8进制数,0x开头为16进制数,0开头为8进制。 5、支持section、key或=号前后带空格。 6、支持\n、\r、\r\n或\n\r换行格式。 7、不区分section、key大小写,但写入时以新串为准,并保持其大小写。 8、新增数据时,若section存在则在该节最后一个有效数据后添加,否则在文件尾部添加。 9、支持指定key所在整行删除,即删除该键值,包括注释。 10、可自动跳过格式错误行,修改时仍然保留。 11、修改时保留原注释:包括整行注释、行尾注释(包括前面空格)。 12、修改时保留原空行。以上三点主要是尽量保留原格式。 不足之处: 1、不支持单key多value(逗号分割),只能一次性提取后自行处理。 2、不支持同名重复section和key。(重复section可视为错误,重复key则可能造成分歧) 3、不能提取所有section或key名称。 使用只需两个文件inirw.h、inirw.c,另有测试程序和工程文件,支持windows和linux。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧