hsearch(3) - wariua/manpages-ko GitHub Wiki
hcreate, hdestroy, hsearch, hcreate_r, hdestroy_r, hsearch_r - ν΄μ ν μ΄λΈ κ΄λ¦¬
#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);
μΈ ν¨μ 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()
μ λ€λ₯΄λ€.
hcreate()
μ hcreate_r()
μ μ±κ³΅ μ 0 μλ κ°μ λ°ννλ€. μ€λ₯ μ 0μ λ°ννλ©° μ€λ₯ μμΈμ λνλ΄λλ‘ errno
λ₯Ό μ€μ νλ€.
μ±κ³΅ μ hsearch()
λ ν΄μ ν
μ΄λΈ λ΄ νλͺ©μ λν ν¬μΈν°λ₯Ό λ°ννλ€. hsearch()
λ μ€λ₯ μμ, μ¦ action
μ΄ ENTER
μΈλ° ν΄μ ν
μ΄λΈμ΄ κ°λ μ°Όκ±°λ action
μ΄ FIND
μΈλ° ν΄μ ν
μ΄λΈμμ item
μ μ°Ύμ μ μλ κ²½μ°μ NULLμ λ°ννλ€. hsearch_r()
μ μ±κ³΅ μ 0 μλ κ°μ λ°ννκ³ μ€λ₯ μ 0μ λ°ννλ€. μ€λ₯ μμ μ΄ λ ν¨μλ μ€λ₯ μμΈμ λνλ΄λλ‘ errno
λ₯Ό μ€μ νλ€.
hcreate_r()
κ³Ό hdestroy_r()
μ΄ λ€μ μ΄μ λ‘ μ€ν¨ν μ μλ€.
EINVAL
-
htab
μ΄ NULLμ΄λ€.
hsearch()
μ hsearch_r()
μ΄ λ€μ μ΄μ λ‘ μ€ν¨ν μ μλ€.
ENOMEM
-
action
μ΄ENTER
μλλ° ν μ΄λΈμμkey
λ₯Ό μ°Ύμ§ λͺ»νκ³ ν μ΄λΈμ μ νλͺ©μ μΆκ°ν 곡κ°μ΄ μλ€. ESRCH
-
action
μ΄FIND
μλλ° ν μ΄λΈμμkey
λ₯Ό μ°Ύμ§ λͺ»νλ€.
POSIX.1μμλ ENOMEM
μ€λ₯λ§ λͺ
μΈνκ³ μλ€.
μ΄ μ μμ μ¬μ©νλ μ©μ΄λ€μ λν μ€λͺ μ attributes(7)λ₯Ό 보λΌ.
μΈν°νμ΄μ€ | μμ± | κ° |
---|---|---|
hcreate() , hsearch() ,hdestroy()
|
μ€λ λ μμ μ± | MT-Unsafe race:hsearch |
hcreate_r() , hsearch_r() hdestroy_r()
|
μ€λ λ μμ μ± | MT-Safe race:htab |
hcreate()
, hsearch()
, hdestroy()
ν¨μλ SVr4μμ μμΌλ©° POSIX.1-2001 λ° POSIX.1-2008μ κΈ°μ λΌ μλ€.
hcreate_r()
, hsearch_r()
, hdestroy_r()
ν¨μλ GNU νμ₯μ΄λ€.
μΌλ°μ μΌλ‘ ν
μ΄λΈμ μΆ©λΆν μ¬μ 곡κ°μ΄ μμ΄μ μΆ©λμ΄ μ΅μνλ λ ν΄μ ν
μ΄λΈ ꡬνμ΄ λ ν¨μ¨μ μ΄λ€. 보ν΅μ nel
κ°μ΄ ν
μ΄λΈμ μ μ₯ν κ±°λΌ μμνλ νλͺ© μ΅λ κ°μλ³΄λ€ μ΅μ 25% μ λ ν° κ² μ’λ€λ λ»μ΄λ€.
hdestroy()
μ hdestroy_r()
ν¨μμμ ν΄μ ν
μ΄λΈ νλͺ©λ€μ key
λ° data
νλκ° κ°λ¦¬ν€λ λ²νΌλ€μ ν΄μ νμ§ μλλ€. (κ·Έ λ²νΌλ€μ΄ λμ μΌλ‘ ν λΉλμλμ§ μ¬λΆλ₯Ό μ μ μμΌλ―λ‘ κ·Έλ΄ μκ° μλ€.) κ·Έ λ²νΌλ€μ ν΄μ ν΄μΌ νλ€λ©΄ (κ°λ Ή νλ‘κ·Έλ¨μμ μ€ν μκ° λ΄λ΄ μ°λ ν΄μ ν
μ΄λΈ νλλ§ λ§λλ κ² μλλΌ λ°λ³΅ν΄μ ν
μ΄λΈμ λ§λ€κ³ μμ€λ€λ©΄) νλ‘κ·Έλ¨μμ λ²νΌλ₯Ό μΆμ νλ μλ£ κ΅¬μ‘°λ₯Ό μ μ§ν΄μΌ νλ€.
SVr4μ POSIX.1-2001μμλ νμ μ€ν¨ μμλ§ action
μ΄ μλ―Έκ° μμΌλ©° κ·Έλμ νμ μ±κ³΅ μμλ ENTER
κ° μ무κ²λ νμ§ μμμΌ νλ€κ³ λͺ
μΈνλ€. libc λ° (λ²μ 2.3 μ μ) glibc ꡬνμμλ κ·Έ λͺ
μΈλ₯Ό μλ°ν΄μ κ·Έ κ²½μ°μ ν΄λΉ key
μ data
λ₯Ό κ°±μ νλ€.
κ°λ³ ν΄μ ν μ΄λΈ νλͺ©λ€μ μΆκ°ν μ μμ§λ§ μμ ν μλ μλ€.
λ€μ νλ‘κ·Έλ¨μμλ ν΄μ ν μ΄λΈμ 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);
}
bsearch(3), lsearch(3), malloc(3), tsearch(3)
2019-03-06