2

我需要在 DOSEMU 下的 linux 中运行一堆旧的 DOS FoxPro / Clipper 应用程序。程序访问位于网络服务器(可能是 Windows 或 Linux 服务器)上的“数据库”

实际上,程序运行良好,但我无法使记录锁定按预期工作:我可以在两个终端(或服务器和任何终端)中运行一个程序,并在两者中锁定相同的记录。

现在,我使用 Tiny Core Linux 作为终端,Windows XP 作为服务器,通过 CIFS 和最新的 DOSEMU (1.4.0) 访问共享文件,但我尝试了各种服务器组合(Ubuntu 7 到 9,Damn Small Linux , XP) <-> 协议 (CIFS, samba, 各种版本的 smbclient) <-> 客户端(与服务器相同)没有运气

我尝试将服务器部分配置为在 samba 中没有机会锁的情况下工作(在阅读了http://oreilly.com/catalog/samba/chapter/book/ch05_05.html中的整个 O'Reilly Samba 书籍锁定章节之后)和 XP( \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\UseOpportunisticLocking = 0),但问题仍然存在。

有任何想法吗?

TIA,巴勃罗

4

6 回答 6

1

@Michael:这些程序在任何 DOS(Lantastic,WFW)或 Windows(95,NT,XP,...)网络上都可以正常工作。

我创建了一个最小的 C 程序来重现该行为:

#include <io.h>
#include <fcntl.h>
#include <sys\stat.h>
#include <process.h>
#include <share.h>
#include <stdio.h>
#include <conio.h>

int main(void)
{
 int handle, status;
 long length;

 handle = sopen("testlock.txt", O_RDONLY,SH_DENYNO,S_IREAD);

 if (!handle)
 {
    printf("sopen failed\n");
    exit(1);
 }

 length = filelength(handle);
 status = lock(handle,0L,length/2);

 if (status == 0)
    printf("lock succeeded\n");
 else
    printf("lock failed\n");

 printf ("Press a key...\n");
 getch();

 status = unlock(handle,0L,length/2);

 if (status == 0)
    printf("unlock succeeded\n");
 else
    printf("unlock failed\n");

 close(handle);
 return 0;
}

它在 DOS / Windows 上工作正常(第一个终端可以锁定,第二个不能),但在 DOSEMU 下的 Linux 中执行失败(您可以在网络共享中同时运行程序的两个实例,并且两者都可以独立获得锁定运行顺序 Linux-Windows / Windows-Linux)。

于 2009-09-18T22:21:44.197 回答
0

我们在 samba 共享上运行一个 dos epos 应用程序,同时使用 Windows 98、Xp 工作站,在 samba 共享上具有正确的锁定设置,我们还能够通过 dosmeu 运行该应用程序。samba 共享上有一系列锁定设置,我们使用了以下设置。

 [data]
        comment = data Share
        inherit acls = Yes
        path = /data/
        read only = No
        oplocks = no
        locking = Yes
        strict locking = No
        create mask = 0774
        directory mask = 0775
        browseable = Yes
        default case = upper
于 2010-09-02T09:54:05.963 回答
0

首先:这些程序是否对锁定有任何线索?它们是否与网络共享上的 db 文件一起运行?

回到 DOS 时代,网络共享并不常见(当它出现时,它经常是 Netware)。如果数据库引擎不知道底层 db 文件可能被共享,那么使用 cifs 并不重要——它没有锁定,所以它不会工作。

现在,如果您已经在 DOS 机器网络上正确运行它并且您正在尝试升级到 Linux,那么当前的 DOS 网络是什么?是 cifs,还是更像 Netware?数据库引擎是否有可能知道网络堆栈并做一些有趣的事情?在数据库引擎不知道网络的新环境中,这可能会导致问题。

如果您真的需要弄清楚发生了什么,您可以尝试使用 Wireshark 来跟踪 CIFS 流量并尝试了解它是如何使用(或不使用)锁定的。不过这是一项很大的工作,除非您可以生成一些用于测试的琐碎应用程序,否则工作量很大。

于 2009-09-18T21:32:00.257 回答
0

这似乎是一个已知的、持续存在的问题

我确实知道字节范围锁定(又名 Windows 风格的记录锁定)需要最新的内核版本,尽管我不知道它是否出现在 2.4 系列中。

如果 DosEMU 不能为您工作,您可能不得不求助于一些更“异国情调”的东西。也许在KVM 虚拟机下运行FreeDOS会让您更接近您的目标,尽管您必须进行一些手动设置以获得网络支持(或者弄清楚如何使网络共享显示为来宾中的本地驱动器号)。滚动到 KVM 兼容列表的底部以查看各种类似 DOS 的安装状态。

如果您有原始的 6.22 安装可以使用,那么这实际上可能是您的最佳选择。

于 2010-06-16T19:04:44.370 回答
0

我可以确认这个问题确实存在,如上所述。一种解决方案是将共享 DBF 文件从 windows 服务器移到 linux 服务器上。然后可以通过 CIFS (SAMBA) 将这些文件共享给感兴趣的 windows 方,并将 vi NFS(使用 -o sync nolock 选项)共享给感兴趣的 linux 方。它对我们很有效

布雷特

于 2009-12-28T09:00:30.127 回答
0

答案其实很简单:posix 锁不适合那个任务。这就是我们在 2014 年底之前所拥有的一切,当时 linux-3.15 和 glibc-2.20 开始提供 OFD 锁 - 在这里提出这个问题 5 年后。

CIFS 在 2018 年才获得 OFD 锁: https ://www.spinics.net/lists/linux-cifs/msg14795.html

dosemu2 在 git (2020) 中有实验性的 OFD 锁支持。

因此,回答您的问题:2009 年的技术(发布该问题时)还不够先进,无法执行您的任务。事实上,这项工作是在 5 年后才开始的,当时 linux 获得了 OFD 锁,而所有其他涉及的软件组件也花了 6 年多的时间才赶上。

注意:除了记录锁定,foxpro/clipper 还对所谓的“共享支持”“感兴趣”——MS 的另一种技术,它本质上与 posix 不兼容。即使现在,共享支持也无法在您的场景中使用。充其量,您可以在同一台机器上运行的多个 dosemu2 会话之间获得适当的共享支持。但是,如果您同时在 Windows 服务器上和 dosemu2 下打开文件,您将无法获得共享。即使您在不同的机器上运行多个 dosemu2 实例,共享支持也不能保证有效。但是,如果您只需要区域锁定,那么它将适用于所有配置,以防您的软件足够新。

于 2020-11-27T14:40:56.823 回答