2012-04-13 3 views
6

ディレクトリを作成する簡単なCプログラム(mkdirクローン)を作成しようとしています。これは私がこれまで持っているものです。PosixでCを使って正しい許可を与えてディレクトリを作成する方法

#include <stdlib.h> 
#include <sys/stat.h> // mkdir 
#include <stdio.h> // perror 

mode_t getumask() 
{ 
    mode_t mask = umask(0); 
    umask (mask); 
    return mask; 
} 

int main(int argc, const char *argv[]) 
{ 
    mode_t mask = getumask(); 
    printf("%i",mask); 

    if (mkdir("trial",mask) == -1) { 
     perror(argv[0]); 
     exit(EXIT_FAILURE); 
    } 
    return 0; 
} 

このコードは、d---------でディレクトリを作成しますが、私はMKDIRが行うように、それはdrwxr-xr-xでそれを作成したいですか?私はここで間違って何をしていますか?

編集: これは私のための実用的なソリューションです:

右の権限の設定
int main(int argc, const char *argv[]) 
{ 
    if (mkdir("trial",0777) == -1) { 
     perror(argv[0]); 
     exit(EXIT_FAILURE); 
    } 
    return 0; 
} 

umask値に応じて、自動的に処理されます。だから私は完全なパーミッションでmkdirを呼び出すだけで済み、それは現在のumaskに応じて細かくなります。

+0

診断プリントは何を生成しますか? '%i'の後に改行を追加した方がうまくいくかもしれませんし、'%i'の代わりに '%o'や'%.4o'を使うと読みやすくなります。また、['umask()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/umask.html)と['mkdir()']を宣言する '#include ' (http://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdir.html)。 –

+0

これは%4oで22を生成します。 – yasar

答えて

0

をエリックが言うように、あなたが得る実際の許可モードの補数でのumaskです。したがって、マスク自体をmkdir()に渡す代わりに、0777-maskmkdir()に渡す必要があります。

+0

ありがとう、確かに私は正しい許可を得るためにumaskを組み込みたいと思っていました。私は0777-maskを0777&〜maskに変更しました。 :) – yasar

+0

私は実際にはumaskを直接使用する必要はありません。見た目には、mkdirは既にそうしているからです。だから私のumaskが022のときに 'drwxr-xr-x'のディレクトリに0777の結果を使う – yasar

7

umaskが使用されていると誤解されているようです。これは、/ターンにあなたがこの(pseduoコード)のように、mkdirなどの呼び出しで指定したファイルモードでビットオフターンに使用されているプロセスのファイルモード作成マスクを検索して、設定します。

real_mode = requested_mode & ~umask 

そうであなたのコードはumask自体の値を渡すので、パーミッションを0に指定することになります。これはまさにあなたが見るものです。

代わりに、あなたはこのように、mkdirに電話で必要な権限を指定する必要があります

mkdir("trial", 0755) 
+3

yasar11732は、現在のユーザーのumask設定を組み込みたいと思います。ハードコーディングは '0755'ではありません。ちょうど私の推測。 –

+1

通常、アプリケーション内でユーザーのumaskを混乱させる必要はありません。 libcはすでに 'mkdir()'でそれを行います。だから、0755または0775をハードコーディングすると完全に問題ありません。 –

+4

'' umask 0''をどうすればいいですか? 0755をハードコーディングすると、0777の代わりに0755になるでしょう。yasar11732がコメントしたように、0777のハードコーディングが正しいかもしれませんが、 '0777&〜mask'には有害ではありません。 –

関連する問題