본문 바로가기

C Language

pipe 함수 사용법

pipe 함수 사용법

  1. pipe(d->pipe):
    • pipe 함수는 두 개의 파일 디스크립터를 생성하여 파이프를 만듭니다. 이 파이프는 프로세스 간의 통신을 가능하게 합니다.
    • d->pipe는 t_data 구조체의 멤버로, 파이프의 읽기 및 쓰기 파일 디스크립터를 저장하는 배열입니다. 일반적으로 d->pipe[0]은 읽기용, d->pipe[1]은 쓰기용으로 사용됩니다.
  2. == -1:
    • pipe 함수가 실패하면 -1을 반환합니다. 따라서 이 조건문은 파이프 생성이 성공했는지 확인합니다.
  3. exit_error(...):
    • exit_error는 오류가 발생했을 때 호출되는 함수입니다. 이 함수는 프로그램을 종료하고, 오류 메시지를 출력하는 역할을 합니다.
    • 이 함수에 전달되는 인자는 오류 메시지와 관련된 정보입니다.
  4. msg("pipe", ": ", strerror(errno), 1):
    • msg 함수는 오류 메시지를 생성하는 함수로 보입니다. 여기서 인자로 전달되는 내용은 다음과 같습니다:
      • "pipe": 오류의 종류를 나타내는 문자열입니다.
      • ": ": 메시지의 구분자입니다.
      • strerror(errno): errno는 최근에 발생한 오류의 번호를 저장하는 전역 변수입니다. strerror(errno)는 이 오류 번호에 해당하는 오류 메시지를 문자열로 반환합니다.
      • 1: 이 인자는 메시지에 번호를 매긴 것입니다. 

전체 의미

이 코드는 파이프를 생성하려고 시도하고, 만약 파이프 생성이 실패하면 오류 메시지를 출력하고 프로그램을 종료하는 역할을 합니다. 즉, 파이프를 성공적으로 생성하지 못하면 이후의 프로세스 간 통신이 불가능하므로, 프로그램의 실행을 중단하고 적절한 오류 메시지를 사용자에게 알리는 것입니다.

이러한 오류 처리는 프로그램의 안정성을 높이고, 문제 발생 시 사용자에게 유용한 정보를 제공하는 데 중요한 역할을 합니다.

 

 

strerror 함수는 C 언어에서 오류 코드에 대한 설명 문자열을 반환하는 함수입니다. 이 함수는 주로 시스템 호출이나 라이브러리 함수가 실패했을 때, 그 실패 원인을 사용자에게 알리기 위해 사용됩니다.

사용법

함수 원형

#include <string.h>

char *strerror(int errnum);
  • errnum: 오류 번호를 나타내는 정수입니다. 이 값은 일반적으로 errno 전역 변수에서 가져옵니다.
  • 반환값: 주어진 오류 번호에 대한 설명 문자열을 반환합니다. 만약 오류 번호가 유효하지 않으면, "Unknown error"라는 문자열을 반환합니다.

예제 코드

아래는 strerror 함수를 사용하는 간단한 예제입니다.

#include <stdio.h>
#include <string.h>
#include <errno.h>

int main() {
    // 예를 들어, 파일을 열려고 시도하지만 실패하는 경우
    FILE *file = fopen("non_existent_file.txt", "r");
    if (file == NULL) {
        // 파일 열기에 실패했을 때 errno를 사용하여 오류 메시지를 출력
        printf("Error opening file: %s\n", strerror(errno));
    } else {
        fclose(file);
    }
    return 0;
}

설명

  1. 헤더 파일 포함: #include <string.h>를 통해 strerror 함수를 사용할 수 있도록 합니다. #include <errno.h>는 errno 변수를 사용하기 위해 포함합니다.
  2. 파일 열기 시도: fopen 함수를 사용하여 존재하지 않는 파일을 열려고 시도합니다. 이 경우, 파일이 존재하지 않기 때문에 fopen은 NULL을 반환합니다.
  3. 오류 처리: 파일 열기에 실패한 경우, errno를 사용하여 오류 번호를 가져오고, strerror(errno)를 호출하여 해당 오류에 대한 설명 문자열을 출력합니다.

주의사항

  • strerror 함수는 반환된 문자열을 수정할 수 없으며, 이 문자열은 프로그램이 종료될 때까지 유효합니다.
  • errno는 여러 시스템 호출이나 라이브러리 함수가 실패할 때 설정되는 전역 변수입니다. 각 호출 후에 errno의 값을 확인하여 어떤 오류가 발생했는지 알 수 있습니다.
  • strerror는 스레드 안전하지 않으므로, 멀티스레드 환경에서는 strerror_r와 같은 스레드 안전한 대체 함수를 사용하는 것이 좋습니다.

strerror_r 사용법 (스레드 안전)

strerror_r는 스레드 안전한 버전의 strerror입니다. 사용법은 다음과 같습니다.

함수 원형

#include <string.h>

int strerror_r(int errnum, char *buf, size_t buflen);
  • buf: 오류 메시지를 저장할 버퍼입니다.
  • buflen: 버퍼의 크기입니다.
  • 반환값: 성공 시 0을 반환하고, 실패 시 오류 코드를 반환합니다.

예제 코드

#include <stdio.h>
#include <string.h>
#include <errno.h>

int main() {
    char error_message[256];
    
    // 예를 들어, 파일을 열려고 시도하지만 실패하는 경우
    FILE *file = fopen("non_existent_file.txt", "r");
    if (file == NULL) {
        // 파일 열기에 실패했을 때 strerror_r를 사용하여 오류 메시지를 출력
        strerror_r(errno, error_message, sizeof(error_message));
        printf("Error opening file: %s\n", error_message);
    } else {
        fclose(file);
    }
    return 0;
}

이 예제에서는 strerror_r를 사용하여 오류 메시지를 안전하게 가져옵니다. error_message 버퍼에 오류 메시지가 저장되며, 이를 출력합니다.