이전 의견에서 제안한 Tony D와 같은 flock을 사용하여이를 해결했습니다. 누군가가 리눅스 프로세스는 프로세스가 사망하더라도 WM_CLOSE의 동등하지 않음
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
class CriticalSection
{
private:
char fileName[FILENAME_MAX];
int fileDescriptor;
public:
CriticalSection(const char *sectionName)
{
// Mark as not acquired
fileDescriptor = -1;
// Build file name path
snprintf(fileName, sizeof(fileName), "/tmp/.%s", sectionName);
}
~CriticalSection()
{
// Release critical section on object deletion
release();
}
void acquire()
{
// Test if section is already acquired
if(fileDescriptor != -1)
return;
// Acquire critical section
fileDescriptor = open(fileName, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
if(fileDescriptor != -1)
lockf(fileDescriptor, F_LOCK, 0);
}
void release()
{
// Release critical section
if(fileDescriptor != -1) {
close(fileDescriptor);
fileDescriptor = -1;
}
}
};
int main()
{
// Create critical section
CriticalSection cs("myappname");
// Enter crtitical section
cs.acquire();
// Critical section code
printf("Critical section has been acquired successfully!\n");
// Leave critical section
cs.release();
return 0;
}
재미 되세요 :) 미래에 그것을 사용하는 Toreno
를 원하시면 여기 내 코드는? 확실하게, 그것은 _some_ 시그널을 얻는다. (죽이지 않는 한, 리눅스가 어떻게 작동하는지 정확히 잊어 버리지 만, 경고없이 죽이는 것은 거의 불가능 해 보인다.) – Mawg
C++에 대한 정보를 들어 본 적이 있나 RAII 관용어 http://stackoverflow.com/questions/ 2321511/what-is-means-by-resources-acquired-is-initialization-raii? 자동으로 원하는 것을 닫거나 놓는 데 도움이됩니다. –
[Advanced Linux Programming] 읽기 (http://advancedlinuxprogramming.com/); ([man_overview (7)] (http://man7.org/linux/man-pages/man7/sem_overview.7.html), [flock (2)] (http : // man7. org/linux/man-pages/man2/flock.2.html) 등) .... –