Недавно у меня возникли проблемы с низкоуровневыми операциями с файлами (в старом устаревшем коде)
fd = open(file, O_RDWR);
...
lseek(fd, 0L, SEEK_END);
write(fd, buffer, len);
...
lseek(fd, pos, SEEK_SET);
read(fd, buffer, len);
в Windows 10 (клиент), если файл находится на общем сетевом диске, предоставляемом, например, Windows Server 2012или 2016. В случае Windows Server 2012 SMB-версия соединения - 3.02, для Windows Server 2016 - 3.1.1.
Ошибка возникает не каждый раз или в одной и той же позиции, иногда при возвратеЗначения lseek () указывают на ошибку, но в большинстве случаев кажется, что lseek () не возвращает правильную позицию EOF или что операция write () в EOF не была завершена до следующей lseek (), что-то вродепроблема синхронизации / кэша. Также пробовал fsync (fd) (или _commit (fd)), O_SYNC и задержки, но он не выглядит надежным.
С Windows 7 в качестве клиента он работает так же, как работал много лет на локальных дисках,Кроме того, когда я монтирую этот диск в Linux, он работает с SMB версий 2.1, 3.02, 3.1.1.
Так что мой вопрос: есть ли известные проблемы с протоколом SMB, сетевыми ресурсами и Windows 10, такие, чтоНа эти низкоуровневые файловые операции, такие как lseek (), влияют?
ОБНОВЛЕНИЕ:
Вот пример
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
#ifdef _WIN32
#include <io.h>
#else
#include <unistd.h>
#define _O_CREAT O_CREAT
#define _O_RDWR O_RDWR
#define _S_IREAD S_IREAD
#define _S_IWRITE S_IWRITE
#define _open open
#define _write write
#define _lseek lseek
#define _close close
#endif
char file[] = "file.txt";
int main() {
int fd = 0;
int ret = 0;
int len = 0;
off_t pos = 0;
off_t last_eof = 0;
char buffer[] = "12345";
int buflen = 0;
int n = 0;
buflen = strlen(buffer);
//unlink(file);
fd = _open(file, _O_CREAT|_O_RDWR, _S_IREAD|_S_IWRITE);
if (fd == -1) { fprintf(stderr, "ERROR open\n"); exit(1); }
ret = _close(fd);
if (ret == -1) { fprintf(stderr, "ERROR close\n"); exit(1); }
for (n = 0; n < 10000; n++)
{
fd = _open(file, _O_RDWR, _S_IREAD|_S_IWRITE);
if (fd == -1) { fprintf(stderr, "ERROR open [%d]\n", n); exit(1); }
pos = _lseek(fd, 0, SEEK_END);
if (pos == -1) { fprintf(stderr, "ERROR lseek1 [%d] pos: %ld\n", n, pos); exit(1); }
if (last_eof > 0 && pos != last_eof) {
fprintf(stderr, "ERROR [%d] eof: %ld last_eof: %ld\n", n, pos, last_eof);
exit(1);
}
len = _write(fd, buffer, buflen);
if (len != buflen) { fprintf(stderr, "ERROR write [%d]\n", n); exit(1); }
pos = _lseek(fd, 0, SEEK_END);
if (pos == -1) { fprintf(stderr, "ERROR lseek2 [%d] pos: %ld\n", n, pos); exit(1); }
last_eof = pos;
ret = _close(fd);
if (ret == -1) { fprintf(stderr, "ERROR close [%d]\n", n); exit(1); }
if (last_eof != (n+1)*buflen) {
fprintf(stderr, "ERROR [%d] eof: %ld\n", n, last_eof);
exit(1);
}
}
fprintf(stdout, "[%d] EOF: %ld\n", n, last_eof);
return 0;
}
(удалите file.txt
перед запуском!)
Скомпилировано с Visual Studio, выполнено на Windows 10 и сетевом диске, случается, что он выходит с «eof-error», например,
> seek5win.exe
ERROR [112] eof: 555 last_eof: 560
, т.е. файл был закрыт с eof / size 560, затем снова открывается с eof / size 555. Если нет другого процесса, обращающегося к файлу, он завершается без ошибок. Однако, если проводник или другой процесс сканирует каталог, lseek / eof-оценка иногда отключается. Использование _sopen_s()
с разными sh_flags не помогло.
В ProcessMonitor это выглядит так (когда вступают в игру Explorer и возвышенный текст):
08:41:10,3133 seek5win.exe QueryStandardInformationFile \\;LanmanRedirector\...\file.txt SUCCESS AllocationSize: 4.096, EndOfFile: 540, NumberOfLinks: 1, DeletePending: False, Directory: False
08:41:10,3191 seek5win.exe CloseFile \\;LanmanRedirector\...\file.txt SUCCESS
08:41:10,3192 seek5win.exe WriteFile \\;LanmanRedirector\...\file.txt SUCCESS Offset: 0, Length: 4.096, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O, Priority: Normal
08:41:10,3347 seek5win.exe CreateFile \\;LanmanRedirector\...\file.txt SUCCESS Desired Access: Generic Read/Write, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: Read, Write, AllocationSize: n/a, OpenResult: Opened
08:41:10,3460 seek5win.exe QueryDeviceInformationVolume \\;LanmanRedirector\...\file.txt SUCCESS DeviceType: Disk, Characteristics: Remote
08:41:10,3594 seek5win.exe QueryStandardInformationFile \\;LanmanRedirector\...\file.txt SUCCESS AllocationSize: 4.096, EndOfFile: 540, NumberOfLinks: 1, DeletePending: False, Directory: False
08:41:10,3643 seek5win.exe ReadFile \\;LanmanRedirector\...\file.txt SUCCESS Offset: 539, Length: 1, Priority: Normal
08:41:10,3644 seek5win.exe ReadFile \\;LanmanRedirector\...\file.txt SUCCESS Offset: 0, Length: 540, I/O Flags: Non-cached, Paging I/O, Priority: Normal
08:41:10,3754 seek5win.exe QueryStandardInformationFile \\;LanmanRedirector\...\file.txt SUCCESS AllocationSize: 4.096, EndOfFile: 540, NumberOfLinks: 1, DeletePending: False, Directory: False
08:41:10,3838 seek5win.exe WriteFile \\;LanmanRedirector\...\file.txt SUCCESS Offset: 540, Length: 5
08:41:10,4013 seek5win.exe QueryStandardInformationFile \\;LanmanRedirector\...\file.txt SUCCESS AllocationSize: 4.096, EndOfFile: 545, NumberOfLinks: 1, DeletePending: False, Directory: False
08:41:10,4101 seek5win.exe CloseFile \\;LanmanRedirector\...\file.txt SUCCESS
08:41:10,4102 seek5win.exe WriteFile \\;LanmanRedirector\...\file.txt SUCCESS Offset: 0, Length: 4.096, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O, Priority: Normal
08:41:10,4363 seek5win.exe CreateFile \\;LanmanRedirector\...\file.txt SUCCESS Desired Access: Generic Read/Write, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: Read, Write, AllocationSize: n/a, OpenResult: Opened
08:41:10,4537 seek5win.exe QueryDeviceInformationVolume \\;LanmanRedirector\...\file.txt SUCCESS DeviceType: Disk, Characteristics: Remote
08:41:10,4751 seek5win.exe QueryStandardInformationFile \\;LanmanRedirector\...\file.txt SUCCESS AllocationSize: 4.096, EndOfFile: 545, NumberOfLinks: 1, DeletePending: False, Directory: False
08:41:10,4870 seek5win.exe ReadFile \\;LanmanRedirector\...\file.txt SUCCESS Offset: 544, Length: 1, Priority: Normal
08:41:10,4870 seek5win.exe ReadFile \\;LanmanRedirector\...\file.txt SUCCESS Offset: 0, Length: 545, I/O Flags: Non-cached, Paging I/O, Priority: Normal
08:41:10,5171 seek5win.exe QueryStandardInformationFile \\;LanmanRedirector\...\file.txt SUCCESS AllocationSize: 4.096, EndOfFile: 545, NumberOfLinks: 1, DeletePending: False, Directory: False
08:41:10,5239 seek5win.exe WriteFile \\;LanmanRedirector\...\file.txt SUCCESS Offset: 545, Length: 5
08:41:10,5375 seek5win.exe QueryStandardInformationFile \\;LanmanRedirector\...\file.txt SUCCESS AllocationSize: 4.096, EndOfFile: 550, NumberOfLinks: 1, DeletePending: False, Directory: False
08:41:10,5475 seek5win.exe CloseFile \\;LanmanRedirector\...\file.txt SUCCESS
08:41:10,5476 seek5win.exe WriteFile \\;LanmanRedirector\...\file.txt SUCCESS Offset: 0, Length: 4.096, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O, Priority: Normal
08:41:10,5646 seek5win.exe CreateFile \\;LanmanRedirector\...\file.txt SUCCESS Desired Access: Generic Read/Write, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: Read, Write, AllocationSize: n/a, OpenResult: Opened
08:41:10,5957 seek5win.exe QueryDeviceInformationVolume \\;LanmanRedirector\...\file.txt SUCCESS DeviceType: Disk, Characteristics: Remote
08:41:10,6111 seek5win.exe QueryStandardInformationFile \\;LanmanRedirector\...\file.txt SUCCESS AllocationSize: 4.096, EndOfFile: 550, NumberOfLinks: 1, DeletePending: False, Directory: False
08:41:10,6210 seek5win.exe ReadFile \\;LanmanRedirector\...\file.txt SUCCESS Offset: 549, Length: 1, Priority: Normal
08:41:10,6211 seek5win.exe ReadFile \\;LanmanRedirector\...\file.txt SUCCESS Offset: 0, Length: 550, I/O Flags: Non-cached, Paging I/O, Priority: Normal
08:41:10,6418 seek5win.exe QueryStandardInformationFile \\;LanmanRedirector\...\file.txt SUCCESS AllocationSize: 4.096, EndOfFile: 550, NumberOfLinks: 1, DeletePending: False, Directory: False
08:41:10,6501 seek5win.exe WriteFile \\;LanmanRedirector\...\file.txt SUCCESS Offset: 550, Length: 5
08:41:10,6547 Explorer.exe QueryDirectory \\;LanmanRedirector\...\file.txt SUCCESS Filter: file.txt, 1: file.txt
08:41:10,6715 seek5win.exe QueryStandardInformationFile \\;LanmanRedirector\...\file.txt SUCCESS AllocationSize: 4.096, EndOfFile: 555, NumberOfLinks: 1, DeletePending: False, Directory: False
08:41:10,6934 seek5win.exe CloseFile \\;LanmanRedirector\...\file.txt SUCCESS
08:41:10,6935 seek5win.exe WriteFile \\;LanmanRedirector\...\file.txt SUCCESS Offset: 0, Length: 4.096, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O, Priority: Normal
08:41:10,6962 Explorer.exe CreateFile \\;LanmanRedirector\...\file.txt SUCCESS Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
08:41:10,7229 seek5win.exe CreateFile \\;LanmanRedirector\...\file.txt SUCCESS Desired Access: Generic Read/Write, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: Read, Write, AllocationSize: n/a, OpenResult: Opened
08:41:10,7408 Explorer.exe QueryBasicInformationFile \\;LanmanRedirector\...\file.txt SUCCESS CreationTime: 31.10.2019 08:41:00, LastAccessTime: 31.10.2019 08:41:00, LastWriteTime: 31.10.2019 08:41:12, ChangeTime: 31.10.2019 08:41:12, FileAttributes: A
08:41:10,7456 seek5win.exe QueryDeviceInformationVolume \\;LanmanRedirector\...\file.txt SUCCESS DeviceType: Disk, Characteristics: Remote
08:41:10,7483 Explorer.exe CloseFile \\;LanmanRedirector\...\file.txt SUCCESS
08:41:10,7585 seek5win.exe QueryStandardInformationFile \\;LanmanRedirector\...\file.txt SUCCESS AllocationSize: 4.096, EndOfFile: 555, NumberOfLinks: 1, DeletePending: False, Directory: False
08:41:10,7645 seek5win.exe ReadFile \\;LanmanRedirector\...\file.txt SUCCESS Offset: 554, Length: 1, Priority: Normal
08:41:10,7646 seek5win.exe ReadFile \\;LanmanRedirector\...\file.txt SUCCESS Offset: 0, Length: 555, I/O Flags: Non-cached, Paging I/O, Priority: Normal
08:41:10,7886 seek5win.exe QueryStandardInformationFile \\;LanmanRedirector\...\file.txt SUCCESS AllocationSize: 4.096, EndOfFile: 555, NumberOfLinks: 1, DeletePending: False, Directory: False
08:41:10,8013 seek5win.exe WriteFile \\;LanmanRedirector\...\file.txt SUCCESS Offset: 555, Length: 5
08:41:10,8221 seek5win.exe QueryStandardInformationFile \\;LanmanRedirector\...\file.txt SUCCESS AllocationSize: 4.096, EndOfFile: 560, NumberOfLinks: 1, DeletePending: False, Directory: False
08:41:10,8246 sublime_.exe CreateFile \\;LanmanRedirector\...\file.txt SUCCESS Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
08:41:10,8319 seek5win.exe CloseFile \\;LanmanRedirector\...\file.txt SUCCESS
08:41:10,8319 seek5win.exe WriteFile \\;LanmanRedirector\...\file.txt SUCCESS Offset: 0, Length: 4.096, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O, Priority: Normal
08:41:10,8453 seek5win.exe CreateFile \\;LanmanRedirector\...\file.txt SUCCESS Desired Access: Generic Read/Write, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: Read, Write, AllocationSize: n/a, OpenResult: Opened
08:41:10,8477 sublime_.exe QueryBasicInformationFile \\;LanmanRedirector\...\file.txt SUCCESS CreationTime: 31.10.2019 08:41:00, LastAccessTime: 31.10.2019 08:41:00, LastWriteTime: 31.10.2019 08:41:12, ChangeTime: 31.10.2019 08:41:12, FileAttributes: A
08:41:10,8679 seek5win.exe QueryDeviceInformationVolume \\;LanmanRedirector\...\file.txt SUCCESS DeviceType: Disk, Characteristics: Remote
08:41:10,8690 sublime_.exe CloseFile \\;LanmanRedirector\...\file.txt SUCCESS
08:41:10,8843 seek5win.exe QueryStandardInformationFile \\;LanmanRedirector\...\file.txt SUCCESS AllocationSize: 4.096, EndOfFile: 555, NumberOfLinks: 1, DeletePending: False, Directory: False
08:41:10,8918 sublime_.exe CreateFile \\;LanmanRedirector\...\file.txt SUCCESS Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
08:41:10,8925 seek5win.exe ReadFile \\;LanmanRedirector\...\file.txt SUCCESS Offset: 554, Length: 1, Priority: Normal
08:41:10,9146 sublime_.exe QueryBasicInformationFile \\;LanmanRedirector\...\file.txt SUCCESS CreationTime: 31.10.2019 08:41:00, LastAccessTime: 31.10.2019 08:41:00, LastWriteTime: 31.10.2019 08:41:12, ChangeTime: 31.10.2019 08:41:12, FileAttributes: A
08:41:10,9167 seek5win.exe QueryStandardInformationFile \\;LanmanRedirector\...\file.txt SUCCESS AllocationSize: 4.096, EndOfFile: 555, NumberOfLinks: 1, DeletePending: False, Directory: False
08:41:10,9324 sublime_.exe CloseFile \\;LanmanRedirector\...\file.txt SUCCESS
08:41:10,9485 seek5win.exe CloseFile \\;LanmanRedirector\...\file.txt SUCCESS
Это происходит с версиями smb3.02 и 2.1.
На локальных дисках такого никогда не наблюдал. В Windows 7 он проходит через цикл без ошибок на сетевом диске (другие процессы, сканирующие файл, могут сделать его очень медленным). В Linux он также работает на сетевом диске (mount -t cifs ..).