IT이야기

getpid()가 int 대신 pid_t를 반환하는 이유는 무엇입니까?

cyworld 2022. 7. 5. 22:25
반응형

getpid()가 int 대신 pid_t를 반환하는 이유는 무엇입니까?

전화의 이면에 있는 논리는 무엇입니까?getpid() 유형 값 반환 pid_t대신unsigned int아니면?int이게 어떻게 도움이 될까요?

휴대성과 관련이 있는 것 같은데요?다음을 보증합니다.pid_t플랫폼 간에 같은 사이즈를 가지며 다른 사이즈를 가질 수 있습니다.ints 등?

그 반대라고 생각합니다.예를 들어 PID가 16비트인지 32비트인지(또는 그 이상인지)에 관계없이 플랫폼을 통해 프로그램을 이식할 수 있도록 합니다.

그 이유는 지저분한 역사적 실행이 여전히 적합하도록 허용하기 위해서이다.지금까지의 실장에서는, 다음과 같은 것이 있습니다(다소 일반적인 경우).

short getpid(void);

물론 최신 시스템은 32비트 이상의 PID를 원하지만 표준이 필수인 경우:

int getpid(void);

모든 역사적 구현이 사용되었습니다.short중요하지 않게 됩니다.이건 용납할 수 없는 일로 여겨져서pid_t작성 및 구현이 허가되어 있습니다.pid_t어느 쪽을 원하든지요

주의: 귀하는 다음 제품을 사용할 의무가 없습니다.pid_tPID를 저장할 수 있을 만큼 큰 타입을 사용하는 한, 자신의 코드로 변환됩니다.intmax_t예를 들면, 정상적으로 동작합니다).유일한 이유는pid_t 존재해야 하는 것은 표준이 정의하기 위한 것이다.getpid,waitpid등입니다.

그것의 목적은 만드는 것이다.pid_t또는 플랫폼에 의존하지 않는 다른 종류의 다른 타입을 사용하여 실제 구현 방법에 관계없이 올바르게 동작합니다.이 프랙티스는 다음과 같이 플랫폼에 의존하지 않을 필요가 있는 모든 유형에 사용됩니다.

  • pid_t: 코딩 대상 시스템에 PID를 저장할 수 있는 크기여야 합니다.매핑처int제가 알기로는 GNU C 라이브러리는 잘 모르지만요.
  • size_t: ANunsigned결과를 저장할 수 있는 변수sizeof교환입니다.일반적으로 코드화할 시스템의 워드 크기와 동일합니다.
  • int16_t(intX_t):정확하게 16비트, 상관 없이 플랫폼의 성분이나, 훨씬 덜 자주, 더 큰 형식(예를 들어,36-bit 단어에서 연속된 비트의 어떤 번호와 이에 따라 PDP-10의"바이트", exa 수 있중 16비트에 접속하는 방법을 제공하 2n-bit 바이트(일반적으로 8- 또는 16비트)를 사용하지 않는 플랫폼에 정의되지 않을 것.ctly 16bits)는 16비트 2의 보완 정수 타입(36비트 시스템 등)을 지원하지 않습니다.일반적으로 매핑 대상short현대 컴퓨터에서는, 비록 그것이 아마도int나이든 사람들에게요
  • int_least32_t(int_leastX_t): 36비트 또는 72비트 시스템의 36비트 등 최소 32비트를 저장할 수 있는 최소 크기여야 합니다.일반적으로 매핑 대상int현대 컴퓨터에서는, 비록 그것이 아마도long나이든 사람들에게요
  • int_fastX_t: 최소 X비트를 저장할 수 있는 가장 빠른 유형이어야 합니다.일반적으로 시스템의 워드 크기입니다.(X <= word_size)(혹은 가끔char위해서int_fast8_t또는 다음과 같이 동작합니다.int_leastX_t한다면(X > word_size))
  • intmax_t: 시스템에서 지원되는 최대 정수 폭이어야 합니다.일반적으로 최신 시스템에서는 최소 64비트가 되지만 일부 시스템에서는 다음보다 큰 확장 유형을 지원할 수 있습니다.long long(그렇다면)intmax_t이러한 유형 중 가장 큰 유형이어야 합니다.
  • 그리고 더...

기계적으로 컴파일러 설치 관리자가typedef적절한 헤더 파일을 만들거나 컴파일러의 실행 파일에 코드화하거나 다른 방법을 사용하여 식별자에 대한 적절한 유형(표준 유형 또는 어색한 이름의 내부 유형)을 백그라운드에서 지정합니다.예를 들어, 32비트 시스템에서는 Microsoft Visual Studio가 다음을 구현합니다.intX_t및 다음과 같은 유형(주의: 내가 추가한 댓글):

// Signed ints of exactly X bits.
typedef signed char int8_t;
typedef short int16_t;
typedef int int32_t;

// Unsigned ints of exactly X bits.
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;

// Signed ints of at least X bits.
typedef signed char int_least8_t;
typedef short int_least16_t;
typedef int int_least32_t;

// Unsigned ints of at least X bits.
typedef unsigned char uint_least8_t;
typedef unsigned short uint_least16_t;
typedef unsigned int uint_least32_t;

// Speed-optimised signed ints of at least X bits.
// Note that int_fast16_t and int_fast32_t are both 32 bits, as a 32-bit processor will generally operate on a full word faster than a half-word.
typedef char int_fast8_t;
typedef int int_fast16_t;
typedef int int_fast32_t;

// Speed-optimised unsigned ints of at least X bits.
typedef unsigned char uint_fast8_t;
typedef unsigned int uint_fast16_t;
typedef unsigned int uint_fast32_t;

typedef _Longlong int64_t;
typedef _ULonglong uint64_t;

typedef _Longlong int_least64_t;
typedef _ULonglong uint_least64_t;

typedef _Longlong int_fast64_t;
typedef _ULonglong uint_fast64_t;

그러나 64비트 시스템에서는 반드시 동일한 방식으로 구현되지 않을 수 있으며, 호환성이 있는 MSVS 버전을 찾을 수 있다고 가정하면 오래된 16비트 시스템에서 동일한 방식으로 구현되지 않을 수 있습니다.

전체적으로 구현의 세부 사항에 관계없이 코드가 올바르게 작동하고 표준 호환 시스템(예:pid_t어떤 시스템을 위해 코딩하든 해당 시스템의 유효한 PID를 유지할 수 있을 만큼 충분히 클 수 있습니다.)또, 요점을 파악할 필요도 없고, 익숙하지 않은 내부명을 검색할 필요도 없습니다.즉, 이 기능을 통해 사용자의 코드가 동일한지 여부에 관계없이 동일하게 동작합니다.pid_t(또는 기타 유사한 typedef)는 다음 명령어로 구현됩니다.int,ashort,along,along long, 또는 심지어__Did_you_really_just_dare_me_to_eat_my_left_shoe__그럴 필요 없어요.


또한 문서의 한 형태로서 주어진 변수의 용도를 한눈에 파악할 수 있습니다.다음 사항을 고려하십시오.

int a, b;

....

if (a > b) {
    // Nothing wrong here, right?  They're both ints.
}

다시 한 번 시도해 보겠습니다.

size_t a;
pid_t b;

...

if (a > b) {
    // Why are we comparing sizes to PIDs?  We probably messed up somewhere.
}

이와 같이 사용하면 문제가 발생할 가능성이 있는 코드 세그먼트를 특정할 수 있어 문제 슈팅이 훨씬 쉬워집니다.

프로그램의 각 프로세스에는 특정 프로세스 ID가 있습니다.pid를 호출하면 현재 프로세스의 할당된 ID를 알 수 있습니다.pid를 아는 것은 우리가 사용할 때 특히 중요하다.fork()반환되기 때문입니다.0그리고.!=0 자녀 및 부모 복사본에 대한 값을 수용적으로 제공합니다.이 2개의 비디오에서는, 비디오 #1 비디오 #2에 대해 명확하게 설명하고 있습니다.

예:다음과 같은 c 프로그램이 있다고 가정합니다.

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>


int main (int argc, char *argv[])
{

  printf("I am %d\n", (int) getpid());
  pid_t pid = fork();
  printf("fork returned: %d\n", (int) pid);
  if(pid<0){
    perror("fork failed");
  }
  if (pid==0){
    printf("This is a child with pid %d\n",(int) getpid());
  }else if(pid >0){
    printf("This is a parent with pid %d\n",(int)getpid());
  }

  return 0;
}

당신이 그것을 실행한다면0어린이용과 비아이용zero/greater than zero부모용입니다.

플랫폼 및 운영체제에 따라 32비트 머신에서는 32비트(예를 들어 pid_t) 또는 64비트 머신에서는 64비트(긴 길이)가 다른 유형일 수 있습니다.또는 어떤 이유로 운영체제가 다른 크기를 선택할 수도 있습니다.또한 코드를 읽을 때 이 변수가 단순히 임의의 숫자가 아닌 "개체"를 나타내는 것을 명확히 합니다.

한 가지 짚고 넘어가야 할 점은 대부분의 답변에서 "pid_t를 사용하면 코드가 다른 시스템에서 작동하게 된다"는 것과 같은 것을 발견했는데, 이는 반드시 맞는 것은 아닙니다.

정확한 표현은 다음과 같아야 한다고 생각합니다.그것은 다른 시스템에서 코드를 컴파일합니다.

예를 들어 32비트의 pid_t를 사용하는 시스템에서 코드를 컴파일하면 64비트의 pid_t를 사용하는 다른 시스템에서 실행할 경우 중단되는 바이너리가 생성됩니다.

언급URL : https://stackoverflow.com/questions/7378854/why-does-getpid-return-pid-t-instead-of-int

반응형