Pipe()의 다양한 프로토타입 처리

Pipe()의 다양한 프로토타입 처리

~에 따르면이 맨페이지, pipe()아키텍처에 따라 다양한 프로토타입이 있을 수 있습니다. 가능한 한 크로스 플랫폼이 되고 싶다면 이제 프로토타입이 제공될 때 컴파일되는 코드를 작성해야 합니까? 이것이 합리적인가(혹은 가능한가?)? 또는 전처리기 지시문을 사용하여 아키텍처를 확인할 수 있습니까?

크로스 플랫폼 주제에 관해서는,POSIX는 첫 번째 프로토타입만 언급합니다., 그러나 Linux 맨페이지에서는 두 번째 페이지를 POSIX와 호환되지 않는 것으로 강조 표시하지 않습니다. 이것은 버그입니까?

1 C++20 기능을 사용하여 무언가를 구현하려고 시도했지만 아직 성공하지 못했습니다.

답변1

pipe당신이 찾은 매뉴얼 페이지두 가지 목적이 있습니다.

  1. Linux 커널에서 사용하는 시스템 호출 인터페이스를 문서화합니다.
  2. Linux의 GNU C 라이브러리에서 제공하는 시스템 호출 래퍼를 문서화합니다.

전자는 아키텍처마다 다를 수 있습니다. 그것이 여기서 일어나고 있는 일입니다.GNU C 라이브러리에서 제공하는 래퍼그러나 실현POSIX pipeAPI:

#include <unistd.h>

int pipe(int fildes[2]);

pipeAlpha System Call API: System Call API와 같은 다른 아키텍처에서도 컴파일러나 링커를 사용할 때 모호함이 없습니다.아니요시스템의 헤더 파일이나 시스템 라이브러리에 이와 같이 표시됩니다(맨 페이지에서는 이를 나타내는 것처럼 보이지만). Alpha Linux 시스템에서 GNU C 라이브러리는 pipe다른 Linux 아키텍처와 마찬가지로 다음과 같이 선언됩니다.

/* Create a one-way communication channel (pipe).
   If successful, two file descriptors are stored in PIPEDES;
   bytes written on PIPEDES[1] can be read from PIPEDES[0].
   Returns 0 if successful, -1 if not.  */
extern int pipe (int __pipedes[2]) __THROW __wur;

따라서 알파에서는 해당 변형을 가정하는 프로그램을 작성하면 struct fd_pair pipe(void);빌드되지 않습니다.

시스템 호출 자체에 액세스하려면 다음을 사용해야 합니다.syscallGNU C 라이브러리에서 제공하는 기능또는 자신만의 시스템 호출 코드를 작성하세요.그건아키텍처별 코드를 제공해야 하지만 이에 대해 실제로 관심을 가질 필요가 있는 사람은 거의 없습니다.

불행하게도 Linux 시스템에서는 C 라이브러리 자체가 아무것도 제공하지 않기 때문에 매뉴얼 페이지가 이런 방식으로 복잡해질 수 있습니다. 따라서 시스템 호출을 래핑하는 함수 호출은 결국 시스템 호출 매뉴얼 페이지에 문서화됩니다. 시스템 호출 자체에 관심이 없다면(실제로 대부분의 개발자도 관심이 없다면) 다음을 읽어 보는 것이 좋습니다.GNU C 라이브러리에 대한 문서이 라이브러리를 사용하여 C로 프로그래밍하는 경우 또는 사용 중인 런타임 라이브러리에 대한 문서(그렇지 않은 경우).

답변2

가능한 한 크로스 플랫폼이 되고 싶다면 이제 프로토타입이 제공될 때 컴파일되는 코드를 작성해야 합니까?

아니요, 여기서는 필요하지 않습니다.

귀하는 직접 시스템 호출에 대한 Part 2 맨페이지 항목을 보고 있습니다. 이것은 언어 런타임 구현자가 자신의 존재를 채우고 유휴 생각을 알릴 때까지 흡수하게 될 문서입니다.

섹션 3, C-시리즈 런타임에 대한 문서가 필요합니다. man 3 pipe나에게 그것은 Google 검색 및 명령으로도 작동합니다. C 계열 언어를 사용하고 있고 이것이 연결하려는 프로토타입인 경우 이식 가능한 섹션 3 API가 문서에서 찾은 시스템별 섹션 2 API를 호출할 수 있도록 툴체인이 정확히 어떻게 배열되어 있습니까? . 링크하려는 런타임(libc++, libstdc++ 또는 glibc)의 소스 코드를 가져와야 한다고 생각합니다. 이식 가능한 코드의 경우 섹션 3 API가 작동해야 합니다™.

관련 정보