2016-03-27 6 views
0

私は、UNIXシステム上のファイルのプロパティを表示する非常に簡単なプログラムを作っています。Cで書かれたst_uidプログラミング

私はこれを行うためにstat()を使用しています。

ただし、ファイルのユーザーとグループを印刷するのに少し問題があります。他のすべては大丈夫だと思われます。

これは(すでに構造体を宣言した)私のコードの小さなスニペットです:

stat(dir_pointer->d_name, &buf); 
printf("%o %s\n", buf.st_nlink, buf.st_uid); 

それは私が私のコードのこの特定の部分を実行するたびにセグメンテーションフォールトを与えます。ユーザとグループは文字列として表示されますか?

EDIT 1

この行で
struct stat buf; // struct for stat 
+0

bufがどのように宣言されているかを示します。 –

+1

'buf'は' struct stat'の可能性が高いです。そうでないコードを許可する厄介なコンパイラを使用している場合を除きます。しかし、 'uid_t'型の' buf.st_uid'を 'printf'に渡し、文字列(' "%s" ')であることを示しています。それがあなたの 'SIGSEGV'の原因でしょう。 – 3442

+0

入力いただきありがとうございます。 'uid_t'型を文字列に変更して 'stdout'に出力することは可能ですか? – Yozuru

答えて

2

st_uidメンバstruct statは、uid_tの整数であり、通常unsigned shortまたはunsigned intと同じです。これには、ユーザー名ではなく数値のuidが含まれます。

あなたが数値のUIDを印刷したい場合は、あなたが最初に明確に定義された整数型にキャストする必要がある、とのprintfで適切なフォーマット記述子を使用します。

printf("%ld\n", (long)buf.st_uid); 

場合は、一方、あなたが関連付けられているユーザ名を印刷するには、変換を実行する機能getpwuidを使用する必要があります:

struct passwd *pwd; 
pwd = getpwuid(buf.st_uid); 
if(pwd == NULL) { 
    perror("getpwuid"); 
} else { 
    printf("%s\n", pwd->pw_name); 
} 

getpwuidは静的バッファへのポインタを返すので、あなたはそののコピーを保存する必要があること値を再利用したい場合はl ater。

+0

私は見る!だから私はそれを最初にキャストする必要があり、その後私はそれを印刷することができます。よく書かれた答えをありがとう。 – Yozuru

1

...

printf("%o %s\n", buf.st_nlink, buf.st_uid); 

これは、多かれ少なかれ、起こる:

ます:ねえ、printf()

printf():はい?

あなた:まず、intをお渡しします。これは8進数で印刷してください。次に、文字列" "を出力する必要があります。次に、私はあなたに文字列、つまりconst char*を与えて、それを印刷します。最後に、文字列"\n"を出力します。

printf():わかっています。私に最初の議論を与えてください。

You:​​

printf():今、2番目です。

You:buf.st_uidこれは実際にタイプuid_tですが、printf()はそれを知らないです。すばらしいです!

printf()アドレス0x03E8でメモリにアクセスしようとしました。 page faultが発生します。

カーネル:やあ、そこには何が起こっているのですか?いくつかの素敵なinterrupt handlerはあなたが無効なアドレスにアクセスしていると私に言った。あなたはSIGSEGVのハンドラを持っていないようです。だから、申し訳ありませんが、PID1223はSIGSEGVで終了します。次回は、薬に反対してください。

つまり、コールを書き込むたびに正しいタイプのものをprintf()に渡していることを再度確認します。

関連する問題