#include <unistd.h> char *getcwd(char *buf, size_t size); char *getwd(char *buf); char *get_current_dir_name(void);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
get_current_dir_name():
getwd():
(_XOPEN_SOURCE >= 500) && ! (_POSIX_C_SOURCE >= 200809L) || /* Glibc 2.19 以降: */ _DEFAULT_SOURCE || /* Glibc 2.19 以前: */ _BSD_SOURCE
getcwd() 関数はカレントワーキングディレクトリの絶対パス名を buf で示された size 長の配列にコピーする。
終端のヌルバイトも含めた、カレントワーキングディレクトリの 絶対パス名の長さが size バイトを超えている場合は、返り値として NULL が返り errno に ERANGE がセットされる。 アプリケーションはこのエラーをチェックし、 必要に応じてより長いバッファーを用意すべきである。
POSIX.1-2001 標準の拡張として、 glibc では buf が NULL の場合、 getcwd() は必要なバッファーを malloc(3) を用いて動的に割り当てる。 この場合、 size が 0 の場合を除き、バッファーの長さは size となる。 size が 0 の場合には必要な大きさが確保される。 呼び出し側で、返されたバッファーを free(3) すべきである。
get_current_dir_name() はカレントワーキングディレクトリの絶対パス名を収めるのに 十分な大きさの配列を malloc(3) で獲得する。環境変数 PWD が設定されておりその値が正しければ、その値が返される。 呼び出し側で、返されたバッファーを free(3) すべきである。
getwd() は malloc(3) によるメモリー獲得を一切行なわない。 buf 引数は少なくとも PATH_MAX バイトの長さを持つ配列へのポインターである必要がある。 終端のヌルバイトも含めた、カレントワーキングディレクトリの 絶対パス名の長さが PATH_MAX バイトを超えている場合、 NULL が返され、 errno に ENAMETOOLONG が設定される。 (システムによっては、 PATH_MAX は必ずしもコンパイル時に決まる定数ではない点に注意すること。 また、ファイルシステムに依存する場合もある。 pathconf(3) を参照。) 移植性とセキュリティ上の理由から、 getwd() の利用は推奨されない。
失敗した場合、これらの関数は NULL を返し、 errno にエラーを示す値を設定する。 buf が指す配列の内容は未定義である。
インターフェース | 属性 | 値 |
getcwd(), getwd() |
Thread safety | MT-Safe |
get_current_dir_name() |
Thread safety | MT-Safe env |
getwd() は POSIX.1-2001 に存在しているが、「過去の名残(LEGACY)」とされている。 POSIX.1-2008 では、 getwd() の仕様が削除されている。 代わりに getcwd() を使うこと。 POSIX.1-2001 は getwd() に関するエラーを定義していない。
get_current_dir_name() は GNU 拡張である。
これらの関数はしばしばカレントワーキングディレクトリの位置を保存し、 後で戻ってくるために利用される。 未使用のファイルディスクリプターが十分ある場合は、 現在のディレクトリ (".") を開いて fchdir(2) を呼び出すほうが普通は高速で信頼性がある。 特に Linux 以外のプラットフォームの場合はそうである。
Following a change in Linux 2.6.36, the pathname returned by the getcwd() system call will be prefixed with the string "(unreachable)" if the current directory is not below the root directory of the current process (e.g., because the process set a new filesystem root using chroot(2) without changing its current directory into the new root). Such behavior can also be caused by an unprivileged user by changing the current directory into another mount namespace. When dealing with pathname from untrusted sources, callers of the functions described in this page should consider checking whether the returned pathname starts with '/' or '(' to avoid misinterpreting an unreachable path as a relative pathname.
[man1]
[man2]
[man3]
[man4]
[man5]
[man6]
[man7]
[man8]
[a]
[b]
[c]
[d]
[e]
[f]
[g]
[h]
[i]
[j]
[k]
[l]
[m]
[n]
[o]
[p]
[q]
[r]
[s]
[t]
[u]
[v]
[w]
[x]
[y]
[z]