- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在训练执行此操作的 2 个过程:
进程 A(客户端):- 它打开一个用于写入的临时文件(使用 GetTempFileName 来 获得一个唯一的文件名)。- 它启动进程 B,将文件名作为参数传递。- 它从标准输入字符串中读取,并写入 中间文件上的那些字符串。 使用固定长度的字符串(例如,#define MAX_LEN 100)。- 当它接收到一个字符串时,它停止从标准输入中读取字符串 文件结尾(ctrl-Z)。- 在终止之前,它写入字符串 “。结尾” 作为文件的最后一行。
进程 B(服务器)的工作方式如下:- 打开中间文件进行读取。- 它会在行可用时立即读取行,并打印出来 出标准输出。
但是进程 B 上的 ReadFile 不会等到文件锁被移除,所以它会在插入第一行之前终止
进程A:
#include <windows.h>
#include <process.h>
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <io.h>
#define MAX_LEN 100
int _tmain(int argc, LPTSTR argv[]){
TCHAR tmpFileName[MAX_PATH];
TCHAR tmppath[MAX_PATH];
TCHAR moment[MAX_PATH];
TCHAR command[MAX_PATH + 256];
UINT uRetVal = 0;
HANDLE bufferW,next;
DWORD n;
PROCESS_INFORMATION piS;
STARTUPINFO siS;
TCHAR buffer[MAX_LEN];
int i=0;
OVERLAPPED ov = { 0, 0, 0, 0, NULL };
LARGE_INTEGER FilePos;
ZeroMemory(&siS, sizeof(siS));
siS.cb = sizeof(siS);
ZeroMemory(&piS, sizeof(piS));
uRetVal = GetTempFileName(_T("."), // directory for tmp files
_T(""), // temp file name prefix
0, // create unique name
tmpFileName); // buffer for name
if (uRetVal == 0)
{
_tprintf("\n errore apertura temp file");
return (3);
}
GetCurrentDirectory(MAX_PATH, moment);
//_stprintf(tmppath, "%s\\ %s",moment,tmpFileName);
_tprintf("\n CLIENT PATH %s \n",moment);
//_stprintf(command,"%s %s","C:\\Users\\zio gianni\\Documents\\Visual Studio 2013\\Projects\\lab11server\\Debug\\lab11server.exe",tmpFileName);
_stprintf(command, "%s %s", "server.exe", tmpFileName);
bufferW = CreateFile(tmpFileName, GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
next = CreateFile(tmpFileName, GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (next == INVALID_HANDLE_VALUE) {
_tprintf(_T("Cannot open client file. Error: %x\n"),
GetLastError());
_tprintf(" \n Nome File: %s\n", "./prova.bin");
return 2;
}
if (bufferW == INVALID_HANDLE_VALUE) {
_tprintf(_T("Cannot open client file. Error: %x\n"),
GetLastError());
_tprintf(" \n Nome File: %s\n", "./prova.bin");
return 2;
}
FilePos.QuadPart = i*MAX_LEN * sizeof (TCHAR);
ov.Offset = FilePos.LowPart;
ov.OffsetHigh = FilePos.HighPart;
ov.hEvent = 0;
LockFileEx(bufferW, LOCKFILE_EXCLUSIVE_LOCK, 0, FilePos.LowPart, FilePos.HighPart, &ov);
printf("file bloccato avvio server con comand: %s\n", command);
if (!CreateProcess(NULL, // No module name (use command line)
command, // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
TRUE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&siS, // Pointer to STARTUPINFO structure
&piS) // Pointer to PROCESS_INFORMATION structure
)
{
printf("CreateProcess failed (%d).\n", GetLastError());
return -5;
}
while (TRUE){
scanf("%s",buffer);
if (strcmp(buffer, "EOF")==0){
break;
}
WriteFile(bufferW, buffer, MAX_LEN*sizeof(TCHAR), &n, NULL);
FilePos.QuadPart =(i+1)* MAX_LEN * sizeof (TCHAR);
ov.Offset = FilePos.LowPart;
ov.OffsetHigh = FilePos.HighPart;
ov.hEvent = 0;
if (i % 2 == 0){
LockFile(next, LOCKFILE_EXCLUSIVE_LOCK, 0, FilePos.LowPart, FilePos.HighPart, &ov);
FilePos.QuadPart = (i )* MAX_LEN * sizeof (TCHAR);
ov.Offset = FilePos.LowPart;
ov.OffsetHigh = FilePos.HighPart;
ov.hEvent = 0;
UnlockFile(bufferW, 0, 0, 0, &ov);
}
else{
LockFile(bufferW, LOCKFILE_EXCLUSIVE_LOCK, 0, FilePos.LowPart, FilePos.HighPart, &ov);
FilePos.QuadPart = (i )* MAX_LEN * sizeof (TCHAR);
ov.Offset = FilePos.LowPart;
ov.OffsetHigh = FilePos.HighPart;
ov.hEvent = 0;
UnlockFile(next, 0, 0, 0, &ov);
}
i++;
}
sprintf(buffer, ".end");
WriteFile(bufferW, buffer, MAX_LEN*sizeof(TCHAR), &n ,NULL);
if (i % 2 == 0){
FilePos.QuadPart = (i)* MAX_LEN * sizeof (TCHAR);
ov.Offset = FilePos.LowPart;
ov.OffsetHigh = FilePos.HighPart;
ov.hEvent = 0;
UnlockFile(bufferW, 0, FilePos.LowPart, FilePos.HighPart, &ov);
}
else{
FilePos.QuadPart = (i)* MAX_LEN * sizeof (TCHAR);
ov.Offset = FilePos.LowPart;
ov.OffsetHigh = FilePos.HighPart;
ov.hEvent = 0;
UnlockFile(next, 0, FilePos.LowPart, FilePos.HighPart, &ov);
}
// Wait until child process exits.
WaitForSingleObject(piS.hProcess, INFINITE);
// Close process and thread handles.
CloseHandle(piS.hProcess);
CloseHandle(piS.hThread);
return 0;
}
进程B:
#include <windows.h>
#include <process.h>
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <io.h>
#define MAX_LEN 100
int _tmain(int argc, LPTSTR argv[]){
HANDLE read;
DWORD n;
int i = 0;
TCHAR buffer[MAX_LEN], path[MAX_LEN];
OVERLAPPED ov = { 0, 0, 0, 0, NULL };
LARGE_INTEGER FilePos;
read = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (read == INVALID_HANDLE_VALUE) {
_tprintf(_T("Cannot open input file. Error: %x\n"),
GetLastError());
_tprintf(" \n Nome File: %s\n", argv[1]);
return 2;
}
_tprintf(" \n Nome File APERTO: %s\n", argv[1]);
GetCurrentDirectory(MAX_LEN,path);
_tprintf(" \n path server: %s\n%s\n", path,argv[1]);
while (ReadFile(read, buffer, MAX_LEN*sizeof(TCHAR), &n, &ov) && n>0 ){
if (n == 0){
fprintf(stderr,"error readfle\n");
return -5;
}
if (strncmp(buffer, ".end", 4) == 0){
_tprintf(" \n STAMPA SERVER: esco\n");
break;
}
_tprintf(" \n STAMPA SERVER: %s\n", buffer);
}
if (n == 0){
fprintf(stderr, "error readfle\n");
return -5;
}
_tprintf("\n END SERVER");
return 0;
}
最佳答案
不要使用实际文件进行进程间通信。使用命名管道!
搜索 CreateNamedPipe
, 有很多例子。
关于c++ - 具有FileLock()的同步多进程在同一文件上读/写c++ win32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30677397/
我试图通过 5 个不同的线程编辑一个 json 文件,然后将其复制 5 次,也到相同的目标路径。如您所见,存在并发问题。 我尝试了这个复制方法: public static void copyFile
我需要锁定一个从三个不同的 android 应用程序读取和写入的文本文件...所以不同的进程。 我尝试在写入时使用 channel lock()(独占模式),在读取文件时使用 lock(0L, Lon
我有一个进程会被 cron 频繁调用,以读取其中包含某些与移动相关的命令的文件。我的进程需要读取和写入此数据文件 - 并保持锁定以防止其他进程在此期间接触它。用户可以执行一个完全独立的过程来(潜在的)
这是我见过的向文件追加行的最清晰的方法。 (如果文件尚不存在则创建该文件) String message = "bla"; Files.write( Paths.get(".queue"),
我使用以下代码在一个 Java 应用程序中获取文件的锁: ... File file = new File("/some/file/at/some/path.txt"); FileChannel ch
我正在设计一个应用程序,其主线程通过读取和写入 .txt 文件与它进行交互。 此应用程序还有一个后台 IntentService,它将读取和写入此文件。 我需要能够读入一个文件,并用新数据将其写回,同
我发现 Java 文件锁定机制是一个真正的错误,因为它不能执行锁定的第一条规则 - 阻塞对锁定的调用!除非我错了 - 如果应用程序已经保持对文件的锁定,则调用 lock() 将抛出异常,我知道我的应用
使用 java.nio.channels.FileLock 的安全性如何用于在进程之间锁定文件?据说如果我们有排它锁,其他进程就无法访问该文件。然而,下面另一个答案SO question声明其他进程也
我只是想知道如果 JVM 严重崩溃或者收到 SIGKILL 信号,FileLock 的锁会发生什么情况。 FileLock doc 中没有任何内容关于它有详细说明,所以我假设它已发布。只是想确定一下.
我试图在我的设备的“外部”存储(在我的情况下不可移动)上锁定正在写入的文件。获得锁定后,我可以进入文件浏览器(在另一个应用程序中)并读取或删除正在写入的文件。有没有办法避免这种情况? FileOutp
Java 中的 FileLock 在同一进程内或不同进程之间或两者之间的多个线程之间是否安全? javadoc说: File locks are held on behalf of the entir
我正在尝试使用 Java FileLock 写入文件, 以禁止所有其他进程和线程读取或写入它,直到我完成它。鉴于 this question以及它的答案,在我看来,这是我想要的完美工具——一个用于文件
我想从 c 程序创建一个文件,我想在我的 c 二进制文件中使用一段时间。但我想以这样的方式创建文件,直到我的 c 程序完成处理文件创建并解锁它,没有人(可能使用 vim 或任何其他编辑器)能够打开和读
我正在创建一个用于打开和编辑 xml 文件的简单应用程序。这些文件位于应用程序的多个实例访问的本地文件夹中。我想要做的是锁定应用程序实例打开的每个文件,以便其他实例无法访问它。 为此,我使用了以下代码
我正在学习 FileOperations,并正在编写一个程序来在 Linux 机器上实现 FileLocking。 这个程序的目的是,如果多人调用该程序,该实例应该获得一个文件锁(类似于 linux
我有一个 tomcat/blazeDS 应用程序,多个用户写入同一个 xml 文件。当他们写的时候,我想对该文件进行文件锁定。我的第一次尝试是获取文件的文件 channel 并为文件建立一个 lock
我注意到 java.io和 java.nio随机访问文件的实现在 FileLocks 方面略有不同。得到处理。 似乎(在 Windows 上)java.io 为您提供强制文件锁定,而 java.nio
我有一个使用 POSIX 建议锁来锁定文件的 C++ 程序。也就是说,它使用 POSIX fcntl system call用于锁定操作。我希望 Java 程序与该 C++ 程序互操作,因此我希望我的
我正在用 Java 创建一个应用程序,我只想为其运行一个实例。为此,我创建了一个文件并在应用程序运行时获得了锁。 我有以下代码,可以在 Windows 上运行,但在 Linux 上失败:一旦我获得了一
我正在使用 the filelock module for Python . 在 Windows 上,当释放锁时,支持它的文件将被删除。 在 UNIX 上,即使在锁被释放后,锁文件仍然存在于文件系统中
我是一名优秀的程序员,十分优秀!