C,C++ & Linux

C/C++ tmpnam(3), tmpfile(3)

KyooDong 2020. 5. 22. 15:33
728x90

함수 기능

임시 파일을 만들어주는 함수입니다.

 

tmpnam() 함수는 buf 가 NULL 일 경우에 내부 버퍼를 이용하여 파일명을 저장한 뒤 그 주소를 리턴합니다.

NULL 이 아닌 경우에는 최대 길이 L_tmpnam 인 문자열을 buf 에 넣어줍니다.

tmpnam() 함수로 생성된 임시 파일은 프로세스가 종료되어도 삭제되지 않으므로 개발자가 unlink() 또는 remove() 함수로 삭제해주어야 합니다.

 

tmpfile() 함수로 만들어진 임시 파일들은 프로세스가 종료됨과 동시에 삭제됩니다.

 

함수 원형

#include <stdio.h>

char *tmpnam(char *buf);
FILE *tmpfile();

매개변수

buf

임시 파일의 파일명을 저장할 버퍼

NULL 일 경우 tmpnam 함수의 내부 버퍼를 사용합니다.

 

반환값

tmpnam()

성공 시 임시 파일의 경로를 가리키는 포인터 리턴

에러 시 NULL 리턴

 

tmpfile()

성공 시 임시 파일의 파일 포인터

에러 시 NULL 리턴하고 errno 설정

예제

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <memory.h>

#define MAX_LINE 4096

int main(int argc, char *argv[]) {
    char buf[MAX_LINE];
    char name[L_tmpnam];
    FILE *fp;

    // 임시 파일 생성
    // tmpnam 의 인자가 NULL인 경우 시스템 버퍼를 이용하여 생성하고
    // 그 이름의 주소를 리턴
    printf("temp file 1 : %s\n", tmpnam(NULL));

    // 임시 파일 생성2
    tmpnam(name);
    printf("temp file 2 : %s\n", name);

    // 임시 파일 생성 3
    if ((fp = tmpfile()) == NULL) {
        fprintf(stderr, "tmpfile error\n");
        exit(1);
    }

    // 임시 파일에 출력
    fputs("tmpfile created temporary file.\n", fp);
    fseek(fp, 0, SEEK_SET);

    // 출력했던거 다시 읽어들임
    if (fgets(buf, sizeof(buf), fp) == NULL) {
        fprintf(stderr, "fgets error\n");
        exit(1);
    }

    // 읽어들인것을 표준 출력에 다시 출력
    fputs(buf, stdout);
    exit(0);
}

 

결과

예제2

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <memory.h>

int main(int argc, char *argv[]) {
    char buf[BUFSIZ];
    char name[L_tmpnam];
    FILE *fp;

    // 임시 파일 생성
    printf("Temporary filename <<%s>>\n", tmpnam(name));

    // 임시 파일 생성 2
    if ((fp = tmpfile()) == NULL) {
        fprintf(stderr, "tmpfile error\n");
        exit(1);
    }

    // 임시파일2에 문자열 출력
    fputs("create tmpfile success!!\n", fp);

    // 임시파일2의 오프셋 포인터를 초기화 시킴
    rewind(fp);

    // 임시파일2에서 한 줄 읽기
    fgets(buf, sizeof(buf), fp);

    // 읽은 것을 표준 출력 파일에 출력
    puts(buf);
    exit(0);
}

 

결과

 

 

 

 

 

 

 

 

 

 

리눅스시스템프로그래밍 저자 : 홍지만
https://book.naver.com/bookdb/book_detail.nhn?bid=14623672

책에 기술된 예제 프로그램입니다. 책 내부에는 훨씬 더 많은 자료가 있습니다. (개인적으로 좋았습니다.)