문제

프로세스가 공유 메모리에서 뮤텍스를 생성하고 뮤트가 잠겨있는 동안 코어를 잠그고 덤프라고 가정합니다.

이제 다른 프로세스에서 Mutex가 이미 잠겨 있지만 프로세스가 소유하지 않았 음을 어떻게 감지합니까?

도움이 되었습니까?

해결책

Linux 또는 이와 유사한 작업을 수행하는 경우 사용을 고려하십시오. 세마포어로 명명되었습니다 (내가 가정하는 것은) pthreads mutxes 대신에. PTHREADS MUTEX의 잠금 PID를 결정할 수있는 방법이 없다고 생각하지 않으며, 자신의 등록 테이블을 구축하지 못하고 공유 메모리에 넣을 수 있습니다.

다른 팁

정확한 답변은 강력한 뮤텍스 형태로 제공 된 것 같습니다.

Posix에 따르면, pthread 뮤트는 pthread_mutexattr_setrobust ()를 사용하여 "강한"으로 초기화 할 수 있습니다. 뮤텍스를 보유한 프로세스가 죽으면 획득 할 다음 스레드는 eownerdead를 받게됩니다 (그러나 여전히 뮤트를 성공적으로 획득 함). 그런 다음 획득 한 MUTEX가 PTHREAD_MUTEX_CONSESTENT ()를 사용하여 다시 일관성이 있음을 알릴 필요가 있습니다.

분명히 당신은 이것을 작동하려면 커널과 LIBC 지원이 필요합니다. Linux에서이 뒤에있는 커널 지원을 "Robust Futexes"라고하며 GLIBC 헤드에 적용되는 사용자 공간 업데이트에 대한 참조를 찾았습니다.

실제로, 이에 대한 지원은 아직 Linux 세계에서 아직 필터링되지 않은 것 같습니다. 이러한 기능을 사용할 수없는 경우 PTHREAD_MUTEXATTR_SETROBUST_NP ()를 대신 찾을 수 있습니다. Solaris 문서와 Debian의 /usr/include/pthread.h에서 pthread_mutexattr_setrobust_np ()에 대한 참조를 찾았습니다.

POSIX 사양은 여기에서 찾을 수 있습니다. http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_setrobust.html

파일 기반 잠금은 어떻습니까 (사용 flock(2))? 이들은 고정 된 프로세스가 죽을 때 자동으로 해제됩니다.

데모 프로그램 :

#include <stdio.h>
#include <time.h>
#include <sys/file.h>

void main() {
  FILE * f = fopen("testfile", "w+");

  printf("pid=%u time=%u Getting lock\n", getpid(), time(NULL));
  flock(fileno(f), LOCK_EX);
  printf("pid=%u time=%u Got lock\n", getpid(), time(NULL));

  sleep(5);
  printf("pid=%u time=%u Crashing\n", getpid(), time(NULL));
  *(int *)NULL = 1;
}

출력 (명확성을 위해 PID와 시간을 약간 잘랐습니다) :

$ ./a.out & sleep 2 ; ./a.out 
[1] 15
pid=15 time=137 Getting lock
pid=15 time=137 Got lock
pid=17 time=139 Getting lock
pid=15 time=142 Crashing
pid=17 time=142 Got lock
pid=17 time=147 Crashing
[1]+  Segmentation fault      ./a.out
Segmentation fault

첫 번째 프로그램은 자물쇠를 획득하고 5 초 동안 잠을자는 것입니다. 2 초 후, 프로그램의 두 번째 인스턴스가 시작되어 잠금을 얻으려고하는 동안 블록이 시작됩니다. 3 초 후, 첫 번째 프로그램은 Segfaults (Bash는 나중에이를 말하지 않습니다). 즉시 두 번째 프로그램은 잠금을 얻고 계속됩니다.

운영 체제에서 제공하는 세마포어를 사용해야합니다.

운영 체제는 프로세스가 사망하든 신속하게 종료하든 프로세스가 열린 모든 리소스를 공개합니다.

나는 누군가가 같은 아이디어를 가지고 있으며 사용에 대한 논의를 찾을 때만이 잘못된 게시물을 배정하지 않았습니다!


이 접근법을 사용할 수 있습니다. 1) POSIX 공유 MUTEX 잠금 2) 공유 메모리에 프로세스 ID를 저장하십시오. 3) 공유 MUTEX 잠금 해제 4) 올바른 출구에서 프로세스 ID 청소

프로세스가 코드프가있는 경우 다음 프로세스는 공유 메모리에서 2 단계에 프로세스 ID가 저장되어 있음을 알게됩니다. OS 에서이 프로세스 ID에 대한 프로세스가 없으면 아무도 공유 뮤텍스를 소유하지 않습니다. 따라서 프로세스 ID를 교체해야합니다.

의견에 답하기 위해 업데이트 :

시나리오 1 : 1. P1이 시작됩니다. 2. P1은 존재하지 않으면 명명 된 뮤트를 생성/엽니 다. P1 Timed_Locks 명명 된 MUTEX 및 성공한 경우 (필요한 경우 10 초 동안 기다립니다); 4. P1 Coredumps 5. P2는 코드 럼프 6. P2가 지명 된 Mutex를 생성/엽니 다. 8. P2 이름이 지정된 Mutex 9를 제거하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top