systemd 服务守护进程和 /dev/shm

问题描述 投票:0回答:1

我有一个 systemd 服务文件,它启动一个用 C++ 开发的应用程序,该应用程序使用

创建信号量
access_sem = sem_open("/sync_nvme_access_sem", O_CREAT, 0666);
if (access_sem == SEM_FAILED) {
       std::cerr << "Cannot create the semaphore" << std::endl;
       return false;
}

这是服务文件:

[Unit]
Description=This is used to start the server
Requires=network-online.target
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/server
ExecStop=/bin/sh /usr/bin/stop-server.sh
WorkingDirectory=/
Restart=on-failure

[Install]
WantedBy=multi-user.target

如果我单独使用该应用程序(作为 root),整个代码运行良好。但当代码从守护进程运行时,我无法创建信号量。

为什么?

linux semaphore daemon systemd
1个回答
0
投票

按照@Boto的建议,我在打开/创建信号量的调用中添加了更多调试消息。我意识到守护进程中与代码的正常运行相比没有使用默认参数(我不知道为什么?)。

因此,抱歉@Rob,但问题不是systemd服务单元的配置,而是代码本身。正确的代码行是:

access_sem = sem_open("/sync_nvme_access_sem", O_CREAT, 0666, 1);
if (access_sem == SEM_FAILED) {
       std::cerr << "Cannot create the semaphore" << std::endl;
       return false;
}
© www.soinside.com 2019 - 2024. All rights reserved.