【发布时间】:2017-11-03 08:21:28
【问题描述】:
我有一个 C++ 脚本,它检查是否必须执行任何操作,如果是,它会启动正确的处理器 C++ 脚本。但是,由于它每 x 分钟运行一次,它还会使用锁定文件检查处理器是否仍在运行。
我使用以下函数来获取锁:
int LockFile(string FileNameToLock) {
FileNameToLock += ".lock";
int fd = open(FileNameToLock.c_str(), O_RDWR | O_CREAT, 0666);
int rc = flock(fd, LOCK_EX | LOCK_NB);
if (rc || rc == -1) {
cout << errno << endl;
cout << strerror(errno) << endl;
return -1;
}
return fd;
}
正在执行的代码:
[...]
if (LockFile(ExecuteFileName, Extra) == -1) {
cout << "Already running!" << endl; //MAIN IS ALREADY RUNNING
//RETURNS ME Resource temporarily unavailable when processor is running from an earlier run
exit(EXIT_SUCCESS);
}
if (StartProcessor) { //PSEUDO
int LockFileProcessor = LockFile("Processor");
if (LockFileProcessor != -1) {
string Command = "nohup setsid ./Processor"; //NOHUP CREATES ZOMBIE?
Command += IntToString(result->getInt("Klantnummer"));
Command += " > /dev/null 2>&1 &"; //DISCARD OUTPUT
system(Command.c_str());
//STARTS PROCESSOR (AS ZOMBIE?)
}
}
第一次运行运行良好,但是当主脚本再次运行时,锁定文件返回 - 1,这意味着发生了错误(仅当处理器仍在运行时)。 errno 为 11,导致错误消息:Resource temporarily unavailable。 请注意,这只发生在(僵尸)处理器仍在运行时。 (但是,主脚本已经终止,应该关闭文件句柄?)
由于某种原因,僵尸保持打开主脚本的锁文件的文件句柄???
我不知道在哪里寻找这个问题。
已解决: 看我的回答
【问题讨论】:
-
您可以检查您的进程是否仍在运行或是否是僵尸进程并停止它们。我没有经验如何通过 C++ 程序以优雅的方式完成此操作,因为我主要是在命令行上执行此操作。
-
我不想杀僵尸。他们必须继续。但是,主处理器可能需要在处理器 A 仍在运行时启动处理器 B,这不起作用,因为我无法获得主处理器的锁。我猜是因为处理器 A 在执行期间将文件句柄保持在主打开的锁文件中,因为当我终止处理器 A 时,我可以获得主锁上的新锁
-
我认为你混淆了僵尸进程和孤儿进程,见en.wikipedia.org/wiki/Zombie_process和en.wikipedia.org/wiki/Orphan_process
-
很棒的评论,这确实是对我想要创建的过程的更好解释!
-
顺便说一下,linux.die.net/man/2/flock 有一句有趣的话:“flock() 创建的锁通过 execve(2) 保存。”。老实说,我不知道它的确切含义以及这是否适用于此。
标签: c++ ubuntu system errno flock