小编Inn*_*der的帖子

在 Linux(或 POSIX)中以只读方式重新打开文件

我以读/写模式打开一个文件并执行一系列读取、写入和搜索(来自用户输入)。

稍后我想将该文件设为只读以防止对其进行任何进一步写入。

是否有 Linux(或 POSIX)功能可以做到这一点?也许有人fcntl打电话?

或者我唯一的选择是保存文件中的当前位置,关闭它并重新打开RD_ONLY

#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int fd = open("/path/to/file", O_RDWR);

// mixture of:
write(fd, ...);
lseek(fd, ...);
read (fd, ...);
// etc

...

// make file read-only ???

read (fd, ...); // OK
lseek(fd, ...); // OK
write(fd, ...); // error
Run Code Online (Sandbox Code Playgroud)

c linux posix

5
推荐指数
1
解决办法
3665
查看次数

将 Cygwin 应用程序作为 Windows 服务运行

我正在研究 WinDRBD ( https://github.com/LINBIT/windrbd ) 一个 Linux DRBD 驱动程序到 Microsoft Windows 的端口。

我们希望将用户模式帮助程序作为 Windows 服务运行(DRBD 有时使用 call_usermodehelper() 调用用户空间应用程序,我们通过从内核驱动程序检索这些请求的守护进程进行模拟,运行它们并将退出状态返回给内核) .

当我们在 cygwin shell 中运行守护进程时,一切正常。但是,当将守护程序作为 Windows 服务运行时,cygwin 似乎找不到它的安装目录(在我的机器上是 C:\cygwin64)。

注册表项 (HKLM/Software/CygWin/setup/rootdir) 指向正确的位置,但我不确定 Windows 服务是否也可以访问它?

该服务未找到 /bin/sh,但是 /cygdrive/c/cygwin64/bin/sh 存在,因此当我使用该路径运行 shell 时,它可以启动(并且还可以找到运行所需的 DLL)。然而,shell 抱怨:

bash.exe:警告:找不到/tmp,请创建!

以正常方式运行 cygwin 时肯定存在。

有没有人试过将 CygWin 编译的 EXE 作为 Windows 服务运行?这是 sc 查询 windrbdum 的输出:

SERVICE_NAME: windrbdum 
    TYPE               : 10  WIN32_OWN_PROCESS  
    STATE              : 4  RUNNING 
                            (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
    WIN32_EXIT_CODE    : 0  (0x0)
    SERVICE_EXIT_CODE  : 0  (0x0)
    CHECKPOINT         : 0x0
    WAIT_HINT …
Run Code Online (Sandbox Code Playgroud)

windows registry service cygwin posix

5
推荐指数
1
解决办法
2692
查看次数

为什么std :: chrono :: duration实例不是通过标准库中的值传递的?

根据cppreference.com:

存储在持续时间中的唯一数据是Rep类型的刻度计数.

但是,我注意到了例如:

this_thread::sleep_for采用sleep_durationconst ref.

future::wait_for同样需要durationconst ref.

等等

(1)他们没有通过价值而被转移的任何特殊原因?

(1a)通过const引用传递是否会使一些可能的constexpr优化变得悲观?

pass-by-reference pass-by-value constexpr c++11

2
推荐指数
1
解决办法
159
查看次数

使用和不使用命名空间 std 的 C++ 长双精度差异;

我偶然发现了我无法解释的奇怪的 C++ 行为。

我试图在调整图像大小(保持其比例)以适应尽可能多的屏幕时计算图像的尺寸。x、y 变量是图像的尺寸,X、Y 变量是屏幕的尺寸。当结果维度不是整数时,我需要使用标准数学规则对它们进行舍入。

这个输入程序499999999999999999 10 1000000000000000000 19给出了(错误的)答案950000000000000000 19

#include <iostream>
#include <cmath>
#include <algorithm>

int main()
{
    long long x, y, X, Y;
    std::cin >> x >> y >> X >> Y;

    long double ratio = std::min((long double)X/x, (long double)Y/y);

    x = round(ratio*x);
    y = round(ratio*y);

    std::cout << x << " " << y << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,下面的代码(仅更改并从函数体中using namespace std;删除)给出了正确的答案。std::main949999999999999998 19

#include <iostream>
#include <cmath>
#include …
Run Code Online (Sandbox Code Playgroud)

c++ std

2
推荐指数
1
解决办法
107
查看次数