• ベストアンサー

fstatでファイルがリンクかどうか分かるか

c言語でファイル操作の勉強をしています. 引数にファイル名を与えてプログラムを実行するとして, そこからfstatでそのファイルがリンクかどうかを, 判別する方法はありますか. また,statなら判別できますか? パソコンはunixです. よろしくお願いします.

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

open()にシンボリックリンクを引数として与えると普通はリンク先のファイルを開きます。なので、シンボリックリンクの判定をするならopen()→fstat()ではなくlstat()にすべきでした。

goopth
質問者

お礼

有り難うございました. 解決しました.

その他の回答 (1)

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

リンクというのは、シンボリックリンク、ハードリンク、それ以外のどれでしょうか? シンボリックリンクなら、fstat()の結果のstruct statのst_modeに対してS_ISLNK()マクロを使えば判定できます。 ハードリンクはstruct statのst_nlinkを見ればリンク数が分かります。 fstatのマニュアルページを参照のこと (man fstat)。

goopth
質問者

補足

回答有り難うございます. 説明不足ですみません.シンボリックリンクです. シンボリックリンクに対して, S_ISLNKを使ったのですが,結果は偽でした. また,S_ISREGだと,結果は真でした. 以下のようにしたのですが,どこか間違ってるでしょうか? 引数にシンボリックリンクの名前を与えプログラムを実行. ↓ 与えられた引数から,ファイル名を取得. ↓ openでファイル記述子を得る. ↓ fstatに先のファイル記述子とstruct statのアドレスを渡す. ↓ S_ISLNK()マクロをstruct statのst_modeに使う. また,疑問なのですが, openシステムコールを使用したときに,自動的にリンク先のファイルを 開いてしまうようなことはないのですか?

関連するQ&A

  • ファイル or ディレクトリの判別

    C言語を勉強中です。 stat()を使用してファイルかディレクトリかの判別を行います。 ヘルプを見ると、構造体のst_modeを調べればいいという所まではわかりました。 この構造体のメンバをどう使用すれば、判別出来ますか?

  • c言語の実行が分かりません

    C言語のプログラムを実行させる方法が分かりません。 unixでC言語を以下の手順で学習しています。 1 emacs上でファイル名.cというソースファイルを作成。 2 xterm上で gcc ファイル名.c と入力 その後xterm上で後一つコマンドを入力すればいいのですが、そのコマンドを忘れてしまいました。教えていただければ、ありがたいです。

  • シンボリックリンクとネットワークファイルシステムの違い

    こんばんは。 UNIXの勉強をしている初心者です。 シンボリックリンクとネットワークファイルシステムの違いが分かりません。 他のPCのディレクトリを自分のパソコンから操作するためにそこをマウントしている。これがNFSだと覚えました。 ディレクトリを開くと、全く別の他のディレクトリにリンクされている。これがシンボリックリンクと習いました。 リンクとマウントという言葉は違うものの、やっていることは一緒では無いでしょうか? 表現がお粗末で申し訳ありませんが、どうちがうのでしょうか? 教えてください。

  • 引数で指定されたファイルを実行する

    実行する時に、引数としてファイル名を指定すると、そのファイルに書かれたスクリプトを実行してプログラムを終了する。 上記のようなCのプログラムを作りたいのですが、まったく見当がつかずに困っています。どうすればよいかご教授ください。

  • シェルからCで作った実行ファイルを動かすには?

    当方、完全に初心者です。 bashのファイルからC言語の実行ファイルを動かすことは可能でしょうか? いくつかのCの実行ファイルを、引数を指定して実行させたのですが、 どのようにすれば一番効果的でしょうか。引数を変えて何度も実行させたいので、スクリプトを書くと便利かなと考えたのですが。 どのように書けばいいのかがわかりません。 どうぞご教授ください。よろしくお願いします。

  • C言語で書き込んだファイルの重複行の削除と行の並び変えるプログラミング

    C言語で書き込んだファイルの重複行の削除と行の並び変えるプログラミング ファイル名が 0.txt というC言語で書き込んだテキストファイルがあり その中身は以下のようなものとします。 111 000 222 555 000 444 222 000 これらを行ごとに見て重複行を削除し 更に値の小さな順に並び変えたい、つまりファイル内を 000 111 222 444 555 となるようなプログラミングを考えているのですが 調べても分からず悩んでいます。 c言語のプログラム内に UNIXコマンドを扱う方法を考えているのですが c言語内でUNIXコマンドを併用するためのsystem()関数 や 重複行を削除する uniq というUNIXコマンドを どのようにプログラム内に挿入すればいいのでしょうか? ご回答、よろしくお願いいたします。 ちなみに以下のプログラムは system関数が理解できない私の作成失敗したものです。 #include <stdio.h> #include <stdlib.h> int main(void) { system("uniq 0.txt"); }

  • ヘッダファイル? malloc.hとかは自分で足したり作ったりできるのでしょうか

    CmachineでC言語を勉強していて、メモリの確保までたどり着きました。 でも、プログラムを実行できないんです。調べたところ、malloc.hやmemory.hがCmachineのincludeフォルダに入っていませんでした。 char *b; b = (char *)malloc(sizeof(char)*200); とか書いても実行できませんよね・・・。Cmachineは勉強するのに便利だし、ヘッダファイルを追加できないのでしょうか。includeフォルダにテキストファイルで書いて入れればできそうなのですが。 ちなみに、Visual C++ Express Editionでも同じプログラムを実行したのですが、できませんでした。あれもヘッダファイルが無いとかの問題なのでしょうか。あれは操作が複雑で難しくてよくわかりません。 アドバイスやいい方法をご存知の方、教えてください!!

  • linuxからC言語のコンパイラー使えますか?

    仕事でunixからC言語のコンパイラーをつかっています。 WindowsXPからC言語となるとすぐVISUALC++を想像してしまい 単純なunixでつかっているようなものが見当たりません。 linuxはつかったことないのですが、unixと似ているとききました。 unixと同じく標準でcコンパイラーは付属しているのでしょうか? ちなみにC言語を使いテキストファイルを編集(並び替えやあるワードの抜き出しやあるワードの置換)するプログラムを組み実行しています。

  • 閉じてないファイルについて

    Visual C++ 2010 Expressで、開いたら閉じなければいけないファイルやハンドルを閉じないでプログラムを終了した場合に、閉じていないファイル名やハンドル名を確認するにはどうすればいいですか? --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C言語

  • 日本語ファイル名のファイルへのリンクを作るには

    日本語ファイル名のファイルへのリンクを作るにはどうすればよいでしょうか? あるディレクトリ(フォルダ)に「日本語ファイル名のファイル」が大量にあります。それらのファイルへのリンクのリストを作りたいのです。 Adobe の PageMill だと、「日本語ファイル名」のファイルへのリンクがうまくいきます。 例えば:  「はじめに.pdf」 は、HTMLのソースで  「1%82%CD%82%B6%82%DF%82%C9.pdf」 のように、「%」から始まる記号に日本語が置き換えられて、ページリンクをマウスでクリックしてもOKです。ですから、できることは確かです。 ただし、100を超えるファイルへのリンクをPageMill で一つ一つ作るのは大変です。 私の環境は、unix の shell、Windows、Windowsのcygwin が使える環境です。

専門家に質問してみよう