Pause(void) 및 sigsuspens(set) 함수의 소스 파일은 어디에서 찾을 수 있습니까?

Pause(void) 및 sigsuspens(set) 함수의 소스 파일은 어디에서 찾을 수 있습니까?

glibc-2.14.1 패키지에서 Pause 및 sigsuspension의 소스 파일을 찾고 싶습니다. 패키지를 grep하고 함수 일시 중지의 정의가 있는 sysdeps/posix/pause.c 파일을 찾았습니다. 코드는 다음과 같습니다.

int 
__libc_pause (void) 
{ 
   sigset_t set; 

   __sigemptyset (&set); 
   __sigprocmask (SIG_BLOCK, NULL, &set); 

   /* pause is a cancellation point, but so is sigsuspend. 
       So no need for anything special here.  */ 

   return __sigsuspend (&set); 
 } 
 weak_alias (__libc_pause, pause) 

또한 sigsuspens 함수가 정의된 패키지를 grep하고 sysdeps/posix/sigsuspens.c 및 sysdeps/unix/sysv/linux/sigsuspens.c와 같은 여러 파일에 정의가 있습니다.

sysdeps/posix/sigsuspens.c에 있는 sigsuspens의 정의는 다음과 같습니다.

int 
__sigsuspend (set) 
    const sigset_t *set; 
{ 
   sigset_t oset; 
  int save; 

  if (set == NULL) 
    { 
     __set_errno (EINVAL); 
      return -1; 
   } 

  if (sigprocmask (SIG_SETMASK, set, &oset) < 0) 
     return -1; 

   (void) pause(); 
   save = errno; 

  if (sigprocmask (SIG_SETMASK, &oset, (sigset_t *) NULL) < 0) 
    return -1; 

   __set_errno (save); 
  return -1; 
 } 
libc_hidden_def (__sigsuspend) 
weak_alias (__sigsuspend, sigsuspend) 

문제를 발견했습니다. sysdeps/posix/pause.c는 sigsuspension 함수를 호출하여 일시 중지하고, sysdeps/posix/sigsuspens.c는 일시 중지 함수를 호출하여 sigsuspension을 일시 중지합니다. 주기인 것 같습니다. 그래서 일시 중지 및 sigsuspension에 대한 올바른 소스 파일을 찾지 못한 것 같습니다. 누구든지 이 기능의 소스 파일이 어디에 있는지 말해 줄 수 있나요? 미리 감사드립니다.

답변1

glibc 트리에는 Pause() 및 sigsuspens()에 대한 여러 정의가 있습니다. 사용되는 실제 정의는 glibc가 구축되는 시스템과 아키텍처에 따라 다릅니다. 이전 Unix 시스템에서는 Pause()는 시스템 호출이고 sigsuspens()는 Pause()를 호출하여 구현됩니다. sigsuspens()가 시스템 호출인 시스템에서, Pause()는 sigsuspens()를 호출하여 구현됩니다. 시스템 호출 자체는 어셈블리 언어로 구현되며 인터럽트를 트리거하거나 특수 명령을 실행하여 커널이 인계받도록 합니다. glibc 빌드 프로세스는 C와 어셈블리 언어 소스 파일의 올바른 조합이 최종 라이브러리 빌드에 사용되도록 보장합니다.

자체 소스 파일이 없는 시스템 호출에는 make-syscalls.sh라는 쉘 스크립트를 사용하여 빌드 프로세스에 의해 생성된 정의가 있으며 해당 작업은 syscalls.list에 의해 구동됩니다. 시스템 호출을 위한 코드는 이 스크립트에 의해 생성됩니다. 스크립트의 코드 생성 부분은 쉘 코드만큼 이해하기 어렵고 처음에 "여기서 무슨 일이 일어나고 있는지 이해하는 가장 좋은 방법은 BUILDDIR/sysd-syscalls의 출력을 검사하는 것입니다."라고 말합니다. glibc를 빌드하여 시스템 호출에 의해 생성된 소스 파일의 직접 코딩된 버전이 없음을 확인합니다.

관련 정보