NAME

restart_syscall - 정지 시그널로 중단된 후 시스템 호출 재시작 하기

SYNOPSIS

long restart_syscall(void);

주의: 이 시스템 호출에 대한 glibc 래퍼가 없다. NOTES 참고.

DESCRIPTION

시그널(가령 SIGSTOP이나 SIGTSTP)에 의해 정지됐던 프로세스가 이후 SIGCONT 시그널을 수신하여 재개된 후에 특정 시스템 호출들을 재시작하기 위해 restart_syscall()을 사용한다. 이 시스템 호출은 커널 내부 용도로만 설계된 것이다.

재시작 때 시간 관련 매개변수를 조정해야 하는 시스템 호출들을 재시작 하는 데에만 restart_syscall()을 사용한다. 말하자면 poll(2) (리눅스 2.6.24부터), nanosleep(2) (리눅스 2.6부터), clock_nanosleep(2) (리눅스 2.6부터), 그리고 futex(2)FUTEX_WAIT(리눅스 2.6.22부터) 및 FUTEX_WAIT_BITSET(리눅스 2.6.31부터)으로 쓸 때이다. restart_syscall()은 (시그널에 의해 프로세스가 정지되어 있던 시간를 포함해) 이미 지난 시간을 고려해 적절히 조정한 시간 인자를 가지고 중단됐던 시스템 호출을 재시작 한다. restart_syscall() 메커니즘이 없다면 프로세스가 실행을 속행했을 때 이 시스템 호출들을 재시작 하면서 이미 지난 시간을 정확히 제하지 못할 것이다.

RETURN VALUE

restart_syscall()의 반환 값은 재시작 하는 그 시스템 호출의 반환 값이다.

ERRORS

restart_syscall()로 재시작 하는 그 시스템 호출에서의 오류에 따라서 errno가 설정된다.

VERSIONS

리눅스 2.6부터 restart_syscall() 시스템 호출이 존재한다.

CONFORMING TO

이 시스템 호출은 리눅스 전용이다.

NOTES

이 시스템 호출에 대한 glibc 래퍼가 없다. 커널에서만 쓰기 위한 것이고 응용에서는 절대 호출하지 말아야 하는 호출이기 때문이다.

프로세스가 시그널에 의해 정지되었다가 SIGCONT에 의해 재개된 후 시스템 호출을 재시작할 때 프로세스가 정지 상태에서 보낸 시간이 원래 시스템 호출에 지정했던 타임아웃 시간에서 빠지도록 하기 위해 커널에서 restart_syscall()을 사용한다. 시스템 호출에서 타임아웃 인자를 받으며 정지 시그널 및 SIGCONT 후에 자동으로 재시작 하지만 restart_syscall() 메커니즘을 내장하고 있지 않은 경우에는 프로세스가 정지 상태로 보낸 시간이 타임아웃 값에서 빠지지 않는다. 이런 문제를 겪는 주요 시스템 호출들로 ppoll(2), select(2), pselect(2)가 있다.

사용자 공간에게는 restart_syscall()의 동작이 거의 보이지 않는다. 재시작 되는 시스템 호출을 불렀던 프로세스에게는 시스템 호출이 평소처럼 실행되고 반환한 것처럼 보인다.

SEE ALSO

sigaction(2), sigreturn(2), signal(7)


2021-03-22