2016-07-24 2 views
1

인수 (예 : 구조체에 대한 포인터)를 신호 처리기에 전달하려면 어떻게해야합니까? 다중 스레드 응용 프로그램을 작성 중이므로 전역 변수를 사용할 수 없습니다.C에서 신호 처리기에 인수 전달

각 스레드에 타이머를 연결합니다. 타이머가 만료되면 구조체를 업데이트해야합니다 (각 스레드마다 다른 구조체가 있음).

어떻게하면됩니까?

+0

그런 다음 스레드 로컬 변수를 사용하는 것은 어떻습니까? –

+0

스레드 로컬 변수를 신호 처리기에 전달하는 방법은 무엇입니까? – WindowsEFI

+0

당신은 더 명확 할 수 있습니까? 신호의 유형을 알려주십시오. 그리고 당신이 원하는 결과의 형식은 무엇입니까! –

답변

0

시스템에서 신호 처리기를 호출하는 방법은 고정되어 있습니다.이를 변경하고 추가 사용자 포인터를 추가 할 방법이 없습니다. 따라서 신호 처리기에 추가 데이터를 가져 오려면 전역 변수 (스레드 로컬 일 수 있음)를 사용하는 것이 유일한 방법입니다.

그러나 스레드와 함께 timer_create을 사용하려는 경우 SIGEV_SIGNAL이 아닌 SIGEV_THREAD을 사용하면 훨씬 편리합니다. 후자는 스레드 대신 프로세스으로 신호를 보내 프로세스의 모든 스레드가 걸릴 수 있습니다.

+0

glibc는 _Thread_local 변수를 느리게, 동적으로 할당하는 것처럼 보입니다. (대다수는 좋지 않은 malloc 호출로) _Thread_local에 대한 첫 번째 액세스가 AS 안전하지 않을 수 있습니다. 나는 이것에 대한 더 많은 정보를 찾을 수 없었다. – PSkocik

0

POSIX 타이머는 에 문서화 된 struct sigevent 구조를 사용하여 프로세스에 만료 사실을 알리는 방법에 대한 세부 정보를 지정할 수 있습니다.

생성 된 신호에 대한 siggnal 처리기에 컨텍스트 정보를 전달하려면, 당신은 당신의 신호 처리기는 다음 검색 할 수있을 것입니다 .sigev_value.sival_ptr 멤버를 설정할 수 있습니다 (당신은 struct sigaction.sa_sigaction 부재를 통하여 신호 처리기를 설정해야합니다 구조의 .sa_flagsSA_SIGACTION으로 ORred인지 확인하는 동안).