2010-03-29 3 views
3

Linux에서 C를 사용하면 write() 함수를 사용하여 버퍼에 데이터를 쓸 때마다 신호 처리기를 트리거하는 방법은 어떨까요? 핸들러는 실행시 버퍼에 기록 된 모든 데이터를 읽습니다.I/O 용 트리거 신호 처리기

+0

성취하고자하는 것이 무엇인지 구체적으로 알려주십시오. 왜 신호가. 다른 스레드에서 작성된 데이터를 기다리지 않는 것이 좋습니다. 함수를 호출하지 말고 신호를 보내면 어떨까요? –

+0

쓰기 작업을 수행하는 코드에 액세스 할 수 있습니까? 왜 읽음을 언급해야할까요? – ezpz

+0

내 문제는 하나의 문자열을 장치에 쓸 때 두 개의 sigio 트리거가 발생한다는 것입니다. 어느 것이 바람직하지 않습니다. 내 신호 처리기는 작성된 모든 문자를 읽습니다. –

답변

4

소켓은 소켓 파일 설명자에서 비동기 모드를 활성화하여이를 지원합니다. 리눅스에서는 fcntl 호출을 사용하여이 작업을 수행합니다.

/* set socket owner (the process that will receive signals) */ 
fcntl(fd, F_SETOWN, getpid()); 

/* optional if you want to receive a real-time signal instead of SIGIO */ 
fnctl(fd, F_SETSIG, signum); 

/* turn on async mode -- this is the important part which enables signal delivery */ 
fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_ASYNC); 
+0

파이프와 FIFO도 커널 2.6에서 이것을 지원합니다. – jschmier

+0

제 질문에 대답 해 주신 모든 분들께 감사드립니다. 대단히 감사합니다. –

2

pipe()O_ASYNC을 사용하면 파이프에 새 데이터가있을 때마다 파이프의 읽기 끝에 SIGIO이 표시됩니다.

2

나는 당신이하고 싶은 것을 100 % 이해하지 못하지만, select이 필요할 수도 있습니다. 데이터가 파일/파이프에 기록 될 때까지 대기합니다. 비동기 I/O를 수행/시뮬레이션하는 데 사용할 수 있습니다. 파일 기술자가 write()와 함께 사용되는 경우

0

FIFO를위한 것이 아닙니다, 파이프 (as suggested by Ken Bloom), 비동기 소켓 (as suggested by mark4o), 그렇지 않으면 신호 (즉, SIGIO)을 발생하지 않습니다, 나는 당신이를 보낼 raise()를 사용할 수도있을 것 같군요 버퍼에 데이터를 기록한 후 현재 프로세스에 신호를 보낸다. 실제로 무엇을 성취하려고하는지에 따라 이것이 최선의 해결책이 아닐 수도 있습니다.


업데이트

내가 제대로 이해하면, 당신은 파일에 기록 할 쓰기의 완성에 생성 된 SIGIO 신호가 다음 신호 처리기 내에서 데이터를 다시 읽어 . 파일에 asynchronous I/O을 사용하려고합니다.

Asynchronous I/O on linux or: Welcome to hell에서 저자는 SIGIO 신호 사용을 포함하여 Linux에서 다양한 비동기 I/O 기술을 설명합니다. SIGIO 신호 기술은 일반 파일과 함께 사용할 수 없습니다.

앞서 언급 한 기사의 저자가 2.6 커널에서 제공되는 POSIX AIO API에 대해별로 생각하지 않지만 어쨌든 비동기식 읽기/쓰기 알림을 제공하는 데 사용할 수 있으므로이 기사를 조사하고 싶을 수 있습니다 시그널과 함수 콜백을 통해 정규 파일로 완성.

Boost application performance using asynchronous I/O에서 저자는 AIO API를 도입하기 전에 기본 Linux I/O 모델에 대한 개요를 제공합니다.

관련 문제