hsearch(3) - wariua/manpages-ko GitHub Wiki

NAME

hcreate, hdestroy, hsearch, hcreate_r, hdestroy_r, hsearch_r - ν•΄μ‹œ ν…Œμ΄λΈ” 관리

SYNOPSIS

#include <search.h>

int hcreate(size_t nel);

ENTRY *hsearch(ENTRY item, ACTION action);

void hdestroy(void);

#define _GNU_SOURCE         /* feature_test_macros(7) μ°Έκ³  */
#include <search.h>

int hcreate_r(size_t nel, struct hsearch_data *htab);

int hsearch_r(ENTRY item, ACTION action, ENTRY **retval,
              struct hsearch_data *htab);

void hdestroy_r(struct hsearch_data *htab);

DESCRIPTION

μ„Έ ν•¨μˆ˜ hcreate(), hsearch(), hdestroy()λ₯Ό 톡해 ν˜ΈμΆœμžκ°€ ν‚€(λ¬Έμžμ—΄)와 연계 λ°μ΄ν„°λ‘œ 이뀄진 ν•­λͺ©λ“€μ„ 담은 ν•΄μ‹œ 탐색 ν…Œμ΄λΈ”μ„ λ§Œλ“€κ³  관리할 수 μžˆλ‹€. 이 ν•¨μˆ˜λ“€μ„ μ“°λ©΄ ν•œλ²ˆμ— ν•΄μ‹œ ν…Œμ΄λΈ” ν•œ 개만 μ‚¬μš©ν•  수 μžˆλ‹€.

μ„Έ ν•¨μˆ˜ hcreate_r(), hsearch_r(), hdestroy_r()은 μž¬μ§„μž… κ°€λŠ₯ 버전이며 ν”„λ‘œκ·Έλž¨μ—μ„œ ν•œλ²ˆμ— μ—¬λŸ¬ 개의 ν•΄μ‹œ 탐색 ν…Œμ΄λΈ”μ„ μ“Έ 수 있게 ν•΄ μ€€λ‹€. λ§ˆμ§€λ§‰ 인자 htabκ°€ κ°€λ¦¬ν‚€λŠ” 것이 ν•¨μˆ˜κ°€ λ™μž‘ν•˜λŠ” ν…Œμ΄λΈ”μ„ κΈ°μˆ ν•˜λŠ” ꡬ쑰체이닀. ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” 이 ꡬ쑰체λ₯Ό 뢈투λͺ…ν•œ κ²ƒμœΌλ‘œ 닀뀄야 ν•œλ‹€. (즉 이 ꡬ쑰체의 ν•„λ“œμ— 직접 μ ‘κ·Όν•˜κ±°λ‚˜ λ³€κ²½ν•˜λ € ν•˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€.)

λ¨Όμ € hcreate()둜 ν•΄μ‹œ ν…Œμ΄λΈ”μ„ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€. 인자 nel은 ν…Œμ΄λΈ” λ‚΄μ˜ ν•­λͺ© μ΅œλŒ€ 개수λ₯Ό μ§€μ •ν•œλ‹€. (이후에 이 μ΅œλŒ“κ°’μ„ λ°”κΏ€ 수 μ—†μœΌλ―€λ‘œ 잘 선택해야 ν•œλ‹€.) κ²°κ³Ό ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ μ„±λŠ₯을 κ°œμ„ ν•˜κΈ° μœ„ν•΄ κ΅¬ν˜„μ—μ„œ 이 값을 μœ„λ‘œ μ‘°μ •ν•  μˆ˜λ„ μžˆλ‹€.

hcreate_r() ν•¨μˆ˜λŠ” hcreate()와 같은 일을 μˆ˜ν–‰ν•˜λ˜ ꡬ쑰체 *htab둜 κΈ°μˆ ν•œ ν…Œμ΄λΈ”μ— λŒ€ν•΄ κ·Έλ ‡κ²Œ ν•œλ‹€. μ²˜μŒμ— hcreate_r()을 ν˜ΈμΆœν•˜κΈ° 전에 htabκ°€ κ°€λ¦¬ν‚€λŠ” ꡬ쑰체λ₯Ό 0으둜 μ±„μ›Œμ•Ό ν•œλ‹€.

hdestroy() ν•¨μˆ˜λŠ” hcreate()둜 λ§Œλ“  ν•΄μ‹œ ν…Œμ΄λΈ”μ΄ μ°¨μ§€ν•˜λŠ” λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•œλ‹€. hdestroy() 호좜 후에 hcreate()둜 μƒˆ ν•΄μ‹œ ν…Œμ΄λΈ”μ„ λ§Œλ“€ 수 μžˆλ‹€. hdestroy_r()은 μœ μ‚¬ν•œ 일을 μˆ˜ν–‰ν•˜λ˜ μ•žμ„œ hcreate_r()둜 μƒμ„±ν•œ *htab둜 κΈ°μˆ ν•œ ν•΄μ‹œ ν…Œμ΄λΈ”μ— λŒ€ν•΄ κ·Έλ ‡κ²Œ ν•œλ‹€.

hsearch() ν•¨μˆ˜λŠ” ν•΄μ‹œ ν…Œμ΄λΈ”μ—μ„œ itemκ³Ό 같은 ν‚€λ₯Ό κ°€μ§„ ν•­λͺ©μ„ νƒμƒ‰ν•œλ‹€. ("같은" 킀인지 strcmp(3)둜 νŒλ‹¨ν•œλ‹€.) μ„±κ³΅ν•˜λ©΄ κ·Έ ν•­λͺ©μ— λŒ€ν•œ 포인터λ₯Ό λ°˜ν™˜ν•œλ‹€.

item μΈμžλŠ” ENTRY νƒ€μž…μΈλ°, <search.h>에 λ‹€μŒμ²˜λŸΌ μ •μ˜λΌ μžˆλ‹€.

typedef struct entry {
    char *key;
    void *data;
} ENTRY;

key ν•„λ“œκ°€ κ°€λ¦¬ν‚€λŠ” 널 μ’…λ£Œ λ¬Έμžμ—΄μ€ 탐색 킀이닀. data ν•„λ“œλŠ” κ·Έ 킀에 μ—°κ³„λœ 데이터λ₯Ό 가리킨닀.

action μΈμžλŠ” 탐색 μ‹€νŒ¨ 후에 hsearch()κ°€ 무엇을 ν• μ§€ κ²°μ •ν•œλ‹€. 이 μΈμžλŠ” item 사본을 μ‚½μž…ν•˜λΌλŠ” 뜻의 ENTER κ°’μ΄κ±°λ‚˜ (이 경우 μƒˆ ν•΄μ‹œ ν…Œμ΄λΈ” ν•­λͺ©μ— λŒ€ν•œ 포인터λ₯Ό ν•¨μˆ˜ 결과둜 λ°˜ν™˜ν•¨) NULL을 λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€λŠ” 뜻의 FIND 값이어야 ν•œλ‹€. (action이 FIND인 경우 dataλŠ” λ¬΄μ‹œλœλ‹€.)

hsearch_r() ν•¨μˆ˜λŠ” hsearch()와 λΉ„μŠ·ν•˜λ˜ *htab둜 κΈ°μˆ ν•œ ν…Œμ΄λΈ”μ— λŒ€ν•΄ λ™μž‘ν•œλ‹€. 그리고 hsearch_r() ν•¨μˆ˜λŠ” 발견 ν•­λͺ©μ— λŒ€ν•œ 포인터λ₯Ό ν•¨μˆ˜ κ²°κ³Όκ°€ μ•„λ‹ˆλΌ *retval둜 λ°˜ν™˜ν•œλ‹€λŠ” μ μ—μ„œ hsearch()와 λ‹€λ₯΄λ‹€.

RETURN VALUE

hcreate()와 hcreate_r()은 성곡 μ‹œ 0 μ•„λ‹Œ 값을 λ°˜ν™˜ν•œλ‹€. 였λ₯˜ μ‹œ 0을 λ°˜ν™˜ν•˜λ©° 였λ₯˜ 원인을 λ‚˜νƒ€λ‚΄λ„λ‘ errnoλ₯Ό μ„€μ •ν•œλ‹€.

성곡 μ‹œ hsearch()λŠ” ν•΄μ‹œ ν…Œμ΄λΈ” λ‚΄ ν•­λͺ©μ— λŒ€ν•œ 포인터λ₯Ό λ°˜ν™˜ν•œλ‹€. hsearch()λŠ” 였λ₯˜ μ‹œμ—, 즉 action이 ENTER인데 ν•΄μ‹œ ν…Œμ΄λΈ”μ΄ 가득 μ°Όκ±°λ‚˜ action이 FIND인데 ν•΄μ‹œ ν…Œμ΄λΈ”μ—μ„œ item을 찾을 수 μ—†λŠ” κ²½μš°μ— NULL을 λ°˜ν™˜ν•œλ‹€. hsearch_r()은 성곡 μ‹œ 0 μ•„λ‹Œ 값을 λ°˜ν™˜ν•˜κ³  였λ₯˜ μ‹œ 0을 λ°˜ν™˜ν•œλ‹€. 였λ₯˜ μ‹œμ— 이 두 ν•¨μˆ˜λŠ” 였λ₯˜ 원인을 λ‚˜νƒ€λ‚΄λ„λ‘ errnoλ₯Ό μ„€μ •ν•œλ‹€.

ERRORS

hcreate_r()κ³Ό hdestroy_r()이 λ‹€μŒ 이유둜 μ‹€νŒ¨ν•  수 μžˆλ‹€.

EINVAL
htab이 NULL이닀.

hsearch()와 hsearch_r()이 λ‹€μŒ 이유둜 μ‹€νŒ¨ν•  수 μžˆλ‹€.

ENOMEM
action이 ENTERμ˜€λŠ”λ° ν…Œμ΄λΈ”μ—μ„œ keyλ₯Ό μ°Ύμ§€ λͺ»ν–ˆκ³  ν…Œμ΄λΈ”μ— μƒˆ ν•­λͺ©μ„ μΆ”κ°€ν•  곡간이 μ—†λ‹€.
ESRCH
action이 FINDμ˜€λŠ”λ° ν…Œμ΄λΈ”μ—μ„œ keyλ₯Ό μ°Ύμ§€ λͺ»ν–ˆλ‹€.

POSIX.1μ—μ„œλŠ” ENOMEM 였λ₯˜λ§Œ λͺ…μ„Έν•˜κ³  μžˆλ‹€.

ATTRIBUTES

이 μ ˆμ—μ„œ μ‚¬μš©ν•˜λŠ” μš©μ–΄λ“€μ— λŒ€ν•œ μ„€λͺ…은 attributes(7)λ₯Ό 보라.

μΈν„°νŽ˜μ΄μŠ€ 속성 κ°’
hcreate(), hsearch(),
hdestroy()
μŠ€λ ˆλ“œ μ•ˆμ „μ„± MT-Unsafe race:hsearch
hcreate_r(), hsearch_r()
hdestroy_r()
μŠ€λ ˆλ“œ μ•ˆμ „μ„± MT-Safe race:htab

CONFORMING TO

hcreate(), hsearch(), hdestroy() ν•¨μˆ˜λŠ” SVr4μ—μ„œ μ™”μœΌλ©° POSIX.1-2001 및 POSIX.1-2008에 기술돼 μžˆλ‹€.

hcreate_r(), hsearch_r(), hdestroy_r() ν•¨μˆ˜λŠ” GNU ν™•μž₯이닀.

NOTES

일반적으둜 ν…Œμ΄λΈ”μ— μΆ©λΆ„ν•œ μ—¬μœ  곡간이 μžˆμ–΄μ„œ 좩돌이 μ΅œμ†Œν™”λ  λ•Œ ν•΄μ‹œ ν…Œμ΄λΈ” κ΅¬ν˜„μ΄ 더 νš¨μœ¨μ μ΄λ‹€. 보톡은 nel 값이 ν…Œμ΄λΈ”μ— μ €μž₯ν•  거라 μ˜ˆμƒν•˜λŠ” ν•­λͺ© μ΅œλŒ€ κ°œμˆ˜λ³΄λ‹€ μ΅œμ†Œ 25% 정도 큰 게 μ’‹λ‹€λŠ” λœ»μ΄λ‹€.

hdestroy()와 hdestroy_r() ν•¨μˆ˜μ—μ„œ ν•΄μ‹œ ν…Œμ΄λΈ” ν•­λͺ©λ“€μ˜ key 및 data ν•„λ“œκ°€ κ°€λ¦¬ν‚€λŠ” 버퍼듀을 ν•΄μ œν•˜μ§€ μ•ŠλŠ”λ‹€. (κ·Έ 버퍼듀이 λ™μ μœΌλ‘œ ν• λ‹Ήλ˜μ—ˆλŠ”μ§€ μ—¬λΆ€λ₯Ό μ•Œ 수 μ—†μœΌλ―€λ‘œ 그럴 μˆ˜κ°€ μ—†λ‹€.) κ·Έ 버퍼듀을 ν•΄μ œν•΄μ•Ό ν•œλ‹€λ©΄ (κ°€λ Ή ν”„λ‘œκ·Έλž¨μ—μ„œ μ‹€ν–‰ μ‹œκ°„ λ‚΄λ‚΄ μ“°λŠ” ν•΄μ‹œ ν…Œμ΄λΈ” ν•˜λ‚˜λ§Œ λ§Œλ“œλŠ” 게 μ•„λ‹ˆλΌ λ°˜λ³΅ν•΄μ„œ ν…Œμ΄λΈ”μ„ λ§Œλ“€κ³  μ—†μ•€λ‹€λ©΄) ν”„λ‘œκ·Έλž¨μ—μ„œ 버퍼λ₯Ό μΆ”μ ν•˜λŠ” 자료 ꡬ쑰λ₯Ό μœ μ§€ν•΄μ•Ό ν•œλ‹€.

BUGS

SVr4와 POSIX.1-2001μ—μ„œλŠ” 탐색 μ‹€νŒ¨ μ‹œμ—λ§Œ action이 μ˜λ―Έκ°€ 있으며 κ·Έλž˜μ„œ 탐색 성곡 μ‹œμ—λŠ” ENTERκ°€ 아무것도 ν•˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€κ³  λͺ…μ„Έν•œλ‹€. libc 및 (버전 2.3 μ „μ˜) glibc κ΅¬ν˜„μ—μ„œλŠ” κ·Έ λͺ…μ„Έλ₯Ό μœ„λ°˜ν•΄μ„œ κ·Έ κ²½μš°μ— ν•΄λ‹Ή key의 dataλ₯Ό κ°±μ‹ ν•œλ‹€.

κ°œλ³„ ν•΄μ‹œ ν…Œμ΄λΈ” ν•­λͺ©λ“€μ„ μΆ”κ°€ν•  수 μžˆμ§€λ§Œ μ‚­μ œν•  μˆ˜λŠ” μ—†λ‹€.

EXAMPLE

λ‹€μŒ ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” ν•΄μ‹œ ν…Œμ΄λΈ”μ— 24개 ν•­λͺ©μ„ μ‚½μž…ν•˜κ³ μ„œ κ·Έ 쀑 일뢀λ₯Ό μ°λŠ”λ‹€.

#include <stdio.h>
#include <stdlib.h>
#include <search.h>

static char *data[] = { "alpha", "bravo", "charlie", "delta",
     "echo", "foxtrot", "golf", "hotel", "india", "juliet",
     "kilo", "lima", "mike", "movember", "oscar", "papa",
     "quebec", "romeo", "sierra", "tango", "uniform",
     "victor", "whisky", "x-ray", "yankee", "zulu"
};

int
main(void)
{
    ENTRY e, *ep;
    int i;

    hcreate(30);

    for (i = 0; i < 24; i++) {
        e.key = data[i];
        /* dataλŠ” 뭔가에 λŒ€ν•œ 포인터가 μ•„λ‹ˆλΌ
           κ·Έλƒ₯ μ •μˆ˜μž„ */
        e.data = (void *) i;
        ep = hsearch(e, ENTER);
        /* μ‹€νŒ¨ν•˜μ§€ μ•Šμ•„μ•Ό 함 */
        if (ep == NULL) {
            fprintf(stderr, "entry failed\n");
            exit(EXIT_FAILURE);
        }
    }

    for (i = 22; i < 26; i++) {
        /* ν…Œμ΄λΈ”μ— μžˆλŠ” ν•­λͺ© 두 개λ₯Ό 찍고,
           ν…Œμ΄λΈ”μ— μ—†λŠ” ν•­λͺ© 두 개 보이기 */
        e.key = data[i];
        ep = hsearch(e, FIND);
        printf("%9.9s -> %9.9s:%d\n", e.key,
               ep ? ep->key : "NULL", ep ? (int)(ep->data) : 0);
    }
    hdestroy();
    exit(EXIT_SUCCESS);
}

SEE ALSO

bsearch(3), lsearch(3), malloc(3), tsearch(3)


2019-03-06

⚠️ **GitHub.com Fallback** ⚠️