C言語でカレントディレクトリを取得する getcwdの使い方
スポンサーリンク
このドキュメントの内容は、以下の通りです。
- はじめに
- プログラムからカレントディレクトリを知る方法
- サンプルコード getcwd.c
- コンパイル方法
- サンプルコード getcwd_null.c
- コンパイル方法
- getwdについて
- getcwd の定義について
- 参考
- 2007/12/09追記
- C言語関連記事
はじめに
オペレーティングシステムでは、ストレージと呼ばれる記憶装置を管理しています。オペレーティングシステムはファイルシステムを利用して、ストレージを管理します。オペレーティングシステムで実行されるプログラムは、ファイルシステムのツリーに紐づけられます。親のプロセスに割り当てられているカレントディレクトリが子プロセスのカレントディレクトリになります。たとえば、LinuxやFreeBSDなどのUnix系OSで、シェルからプログラムを起動したときに、実行されたプログラムがファイルを相対パスで開く場合、シェルのカレントディレクトリの位置から相対的にみたパスになります。
プログラムからカレントディレクトリを知る方法について説明致します。
プログラムからカレントディレクトリを知る方法
プログラムは、カレントディレクトリを知ることができます。カレントディレクトリを知るためには、C言語の場合は、 getcwd() と呼ばれる関数を利用します。getcwdのcwdは、current working directoryの略です。つまるところ、getcwdは カレントワーキングディレクトリを取得(get)するという意味になります。
getcwd は、 使い方によっては、関数内で malloc で動的にメモリを確保するため、その場合には、明示的なメモリの解放が必要になるため、明示的なfreeが必要になりますので、ご注意下さい。
サンプルコード getcwd.c
getcwdのサンプルコードを以下に示します。#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/param.h> char * Getcwd (char *buf, size_t size) { char *p = getcwd (buf, size); if (! p) { perror ("getcwd"); } return (p); } int main(int argc, char *argv[]) { char path[MAXPATHLEN]; if (Getcwd (path, sizeof (path) ) == NULL) { exit (EXIT_FAILURE); } (void) puts (path); exit (EXIT_SUCCESS); }
コンパイル方法
サンプルプログラムのコンパイル方法は以下の通りです。cc -Wall getcwd.c
サンプルコード getcwd_null.c
getcwdの第一引数には、NULLポインタを渡すこともできます。NULLポインタを渡した場合、 getcwdの中で PATH_MAX分のメモリを動的に確保(malloc)します。その代わり、プログラマが getpwdによって確保されたメモリを明示的にfree(解放)する必要があります。メモリを解放せずに、何度も getcwd を呼び出すと、メモリリークの原因になります。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/param.h> char * Getcwd (char *buf, size_t size) { char *p = getcwd (buf, size); if (! p) { perror ("getcwd"); } return (p); } int main(int argc, char *argv[]) { char *p; p = Getcwd (NULL, 0); if (p == NULL) { exit (EXIT_FAILURE); } (void) puts (p); free (p); exit (EXIT_SUCCESS); }
コンパイル方法
cc -Wall getcwd_null.c
getwdについて
getwd()という関数がありますが、これは、 getcwdのバッファを MAXPATHLEN として呼び出したのと同じ意味になります。p = getcwd(buf, MAXPATHLEN);
getcwd の定義について
FreeBSD の場合は、 getcwd の実装は /usr/src/lib/libc/gen/getcwd.cに定義されています。getcwd を読んでいくと、さらに __getcwd を呼び出してます。__getcwd は、
システムコールの名前の一覧が /usr/src/sys/kern/syscalls.c に配列で定義されています。その中に __getcwd が含まれているため、 __getcwd はシステムコールとして実装されているようです。
getcwdのソース /usr/src/lib/libc/gen/getcwd.c をぼんやり見ていたら、 mallocの引数のところで、代入なんかしてて、たいしたことはありませんが、面白いです。
if ((pt = malloc(ptsize = PATH_MAX)) == NULL) return (NULL); ept = pt + ptsize;
参考
FreeBSDドキュメント jman getcwd2007/12/09追記
getcwdをgetpwdとタイポしていたところを修正しました。C言語関連記事
[2008-05-03-1] FreeBSD C言語 kqueue/keventで簡易tail -fコマンドを作る[2008-04-06-2] Unix C言語で超簡単なlsコマンドを作ってみる
[2007-12-27-2] C言語でCSVの文字列をsscanfで読み込む方法
[2007-12-22-1] FreeBSD C言語のerrnoの実装
[2007-09-23-3] C言語の_Boool型とC99とgccとstdbool.hのbool型
[2007-07-17-1] C言語による間違えトップ10
[2007-07-16-1] C言語使いのJavaScript strstr
[2007-07-02-4] Part1 オープンソース/C言語に学ぶ「ソースコードの読み方」
参照しているページ (サイト内): [2007-12-27-2]
スポンサーリンク
スポンサーリンク
いつもシェア、ありがとうございます!
もっと情報を探しませんか?
関連記事
最近の記事
- パナソニック ジェットウォッシャードルツ EW-DJ61-Wのホースの修理
- LinuxセキュリティモジュールIntegrity Policy Enforcement
- アマゾンのEcho Show 5を買ったのでレビューします
- アマゾンのサイバーマンデーはAlexa Echo Show 5が安い
- Android スマートフォン OnePlus 7T と OnePlus 7の違い
- Android スマートフォン OnePlus 7 をAndroid10にアップデートしてみた
- クレジットカードのバーチャルカードの比較のまとめ
- 活動量計 Xiaomi Mi Band 4を買ってみたのでレビュー
- Android スマートフォン OnePlus 7 のレビュー
- AliExpressでスマートフォンを買い物してみた
- パソコンのホコリ対策 レンジフードフィルターと養生テープ
- 80PLUS GOLDのPC電源ユニットAntec NeoEco 750 Goldのレビュー
- イギリスの付加価値税 VAT は払い戻しを受けられる
- イギリスのロンドンでスーツケースなど荷物を預けられる場所は
- イギリスのロンドンで地下鉄やバスに乗るならオイスターカードを使おう
- イギリスのヒースロー空港からロンドン市内への行き方
- 航空便でほかの航空会社に乗り継ぎがある場合のオンラインチェックイン
- SFC会員がANA便ではなくベトナム航空のコードシェアを試して解ったこと
- ベトナムの入国審査でeチケットの掲示が必要だった話
- シアトルの交通ICカードはオルカカード(Orca)です
人気のページ
- Windows7 IME 辞書ツールで単語の登録に失敗しました
- C言語 popen()でコマンドを実行して出力を読み込む
- Windows7で休止状態にする方法
- CentOS MySQLの起動、停止、再起動
- loggerコマンドでsyslogにエラーを出力する方法
- パソコンパーツの買取をしてくれる店のまとめ
- Java Mapの使い方 get(),put(),remove(),size(),clear()
- 楽天のRポイントカードを作ってみた
- iPhone 5 から iPhone 6 に乗り換えたのでレビュー
- netstatコマンドのステータスの意味
スポンサーリンク
過去ログ
2020 : 01 02 03 04 05 06 07 08 09 10 11 122019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12