我有一个 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),整个代码运行良好。但当代码从守护进程运行时,我无法创建信号量。
为什么?
按照@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;
}