ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

ファイルのアクセス権限設定について教えて下さい。

Linux環境化でファイルのアクセス権限情報を設定するための
関数はないでしょうか?
※ open関数のmodeに設定したのですが、ステッィキービット等が
付与できません。
[0644]は可能だが、[3644]は設定できません。

どなたかご存知の方がいらっしゃりましたら、ご教授下さい。

#環境
 言語:C、OS:Cent OS
#参考
 取得について:URL http://oshiete1.goo.ne.jp/qa4955286.html

このQ&Aに関連する最新のQ&A

A 回答 (3件)

スティッキービットの設定出来ましたよ。



----------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>

int main(int argc, char *argv[])
{
  char filename[] = "test_file.txt";
  struct stat buf;
  int nResult = 0;

  memset(&buf, 0, sizeof(buf));
  nResult = stat(filename, &buf);

  if (nResult)
  {
    perror("ファイル情報が取得できませんでした.");
    return 1;
  }

  nResult = chmod(filename, buf.st_mode | S_ISVTX);
  if (nResult)
  {
    perror("スティッキービットの設定に失敗しました.");
    return 1;
  }

  return 0;
}
----------------------------------------------------------------------
S_ISVTX と言うのがスティッキービットのフラグです。
    • good
    • 0

0644は8進数です 2進数にすると 110 100 100


3644は10進数ですね

この回答への補足

失礼いたしました。
[00644]は可能ですが、[03644]はできません。
に訂正させていただきます。

補足日時:2009/05/28 12:50
    • good
    • 0
    • good
    • 0
この回答へのお礼

さっそくのご回答ありがとうございます。
chmodですと作成した後に変更という流れになると思いますが
作成したと同時に権限設定も終えてしまいたいのです。

情報が足りず、申し訳ありません。

お礼日時:2009/05/28 12:53

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qファイルのアクセス権の取得

こんにちは。いつもお世話になっております。
ファイルのアクセス権を取得する処理を記述していて行き詰まってしまいました。
今、指定ファイルに対してアクセス許可、アクセス拒否が設定されているか取得する関数を作成しています。

-------------------------------------------------

//AceType --> ACE種別(1:アクセス許可 2:アクセス拒否)

psd = GlobalAlloc(GMEM_FIXED, 1000);

//ファイルのセキュリティ情報取得
GetFileSecurity(DirPath, DACL_SECURITY_INFORMATION, psd, 1000, &sdsize);
GetSecurityDescriptorDacl(psd, &DaclPresent, &pacl, &DaclDefaulted);
if(!DaclPresent){
//随意ACLがない
GlobalFree(psd);
return 0;
}
else{
GetAclInformation(pacl, &AclSize, sizeof(AclSize), AclSizeInformation);
AceCount = AclSize.AceCount;

for(i = 0; i < AceCount; i++){
//ACE取得
GetAce(pacl, i, (LPVOID *)&pace);
if(AceType == 1 && pace->Header.AceType == ACCESS_ALLOWED_ACE_TYPE){
//アクセス許可
break;
}
if(AceType == 2 && pace->Header.AceType == ACCESS_DENIED_ACE_TYPE){
//アクセス拒否
break;
}
}

GlobalFree(psd);
return 1;
}

-------------------------------------------------

通常のファイルについてはうまく取得できているようですが、FD内のファイルについてアクセスするとエラーとなってしまいます。
どうやら「GetFileSecurity」で「SecurityDesc」にTRUEが返ってきているようなのです。
しかし、当然「pacl」には何も返ってこないため、「GetAclInformation」でエラーとなります。
なぜ、「SecurityDesc」にTRUEが返ってきてしまうのでしょうか?
どうかご教示下さい。

<環境>
Windows 2000, Visual C++ 6.0

こんにちは。いつもお世話になっております。
ファイルのアクセス権を取得する処理を記述していて行き詰まってしまいました。
今、指定ファイルに対してアクセス許可、アクセス拒否が設定されているか取得する関数を作成しています。

-------------------------------------------------

//AceType --> ACE種別(1:アクセス許可 2:アクセス拒否)

psd = GlobalAlloc(GMEM_FIXED, 1000);

//ファイルのセキュリティ情報取得
GetFileSecurity(DirPath, DACL_SECURITY_INFORMATION, psd, 1000, &sdsize...続きを読む

Aベストアンサー

ファイルのアクセス権の対象となるのは、NTFSのディスクシステムです。
フロッピーは対象でないですね。

Win32サブルーチンズ - Windows NTでファイルにアクセス権を設定する方法
http://www7a.biglobe.ne.jp/~tsuneoka/win32tech/10.html

| ファイルシステムがNTFS(NT File System)でフォーマットされたディスクのみが利用できます.

--
> なぜ、「SecurityDesc」にTRUEが返ってきてしまうのでしょうか?

「GetFileSecurity」関数の実行結果を確認してください。
処理自体が失敗している場合、「SecurityDesc」変数の内容は保証されません。

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

Qaccess関数を説明できる方いますか?

C言語に、ファイルの存在の有無を確認できる
accessという関数があったと思うのですが
使用するヘッダファイルや引数、戻り値などを
説明できる方いらっしゃいましたらどうかお願いします。

accessを使用したらR_OK,F_OKとかいうマクロが
必要になったと思うのですが・・・

Aベストアンサー

acceess()は元々UNIXのシステムコールであり、POSIX準拠OS以外では互換性が保証されません。
これはsignal()などとともに「移植性を阻害する標準関数」の筆頭に分類されます。

環境が指定されていないのでPOSIXのaccess(2)を想定します。

#inclue <io.h>
int access(const char *, int) ;
第1引数:ファイルパス名
第2引数:チェックするモード(0=存在、2=書きこみ、4=読み出し,6=読み書き)
関数値が-1の時、グローバル変数errnoに以下の値がセットされます。
EACCESS=指定したアクセス権が許可されていない
ENOENT=ファイルが損さしない
(errnoを使用するためにはerrno.hが必要)

ファイルの存在チェックだけならmacros.hのexist()マクロかstat(2)の方が楽なのではないでしょうか。
#include <sys/types.h>
#include <sys/stat.h>
int stat(const char *, struct stat *) ;

#include <sys/types.h>
#include <sys/stat.h>
#include <macros.h>
int exist(const char *) ;

POSIX以外の処理系の場合、OSとコンパイラを指定してください。

acceess()は元々UNIXのシステムコールであり、POSIX準拠OS以外では互換性が保証されません。
これはsignal()などとともに「移植性を阻害する標準関数」の筆頭に分類されます。

環境が指定されていないのでPOSIXのaccess(2)を想定します。

#inclue <io.h>
int access(const char *, int) ;
第1引数:ファイルパス名
第2引数:チェックするモード(0=存在、2=書きこみ、4=読み出し,6=読み書き)
関数値が-1の時、グローバル変数errnoに以下の値がセットされます。
EACCESS=指定したアクセス権が許可さ...続きを読む

Qアクセス権のチェック方法について

あるフォルダ以下に、ユーザ毎にアクセス権が設定されたファイルがあり、指定したユーザが指定ファイルを読むことができるかをチェックするツールを作りたいと考えています。

APIを見ていて、LogonUser、ImpersonateLoggedOnUserを使ってチェックするユーザで偽装し、CreateFileでチェックするファイルを開けばよいかと思い、下記のようなコードを試しました。

-----

HANDLE hToken = NULL;
HANDLE hFile = NULL;

PTSTR pszUserName = "testuser";
PTSTR pszDomainName = "."
PTSTR pszPassword = "testuser";
PTSTR pszFilePath = "C:\\test\\dir01\\001.txt";

try {
{
if (!LogonUser(pszUserName, pszDomainName, pszPassword,
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken)) {
printf("error:%d\n",GetLastError());
goto leave;
}

hFile = CreateFile(pszFilePath,
GENERIC_READ,
FILE_SHARE_READ, NULL, OPEN_EXISTING,
SECURITY_SQOS_PRESENT | SECURITY_EFFECTIVE_ONLY, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
printf("error2:%d\n",GetLastError());
} else {
printf("OK\n");
}
}
} leave:;
} catch(...) {}

-----

実行するとLogonUser、ImpersonateLoggedOnUserは成功しているようですが、セキュリティの有無にかかわらずすべてのファイルがCreateFileに成功してしまいます。
読み取り権限が無いファイルに対してはCreateFileは失敗すると思っていましたが違うのでしょうか?

それとも、セキュリティをチェックする方法として根本的に間違っています??

情報をお待ちしております。


環境は以下の通りです。

Win2000 SP4
VisualStudio6(VC++)

あるフォルダ以下に、ユーザ毎にアクセス権が設定されたファイルがあり、指定したユーザが指定ファイルを読むことができるかをチェックするツールを作りたいと考えています。

APIを見ていて、LogonUser、ImpersonateLoggedOnUserを使ってチェックするユーザで偽装し、CreateFileでチェックするファイルを開けばよいかと思い、下記のようなコードを試しました。

-----

HANDLE hToken = NULL;
HANDLE hFile = NULL;

PTSTR pszUserName = "testuser";
PTSTR pszDomainName = "."
PTSTR pszPasswo...続きを読む

Aベストアンサー

ファイル不存在時の件ですが、こちらではファイル不存在時にはCreateFileでエラーとなりGetLastError()が2(ERROR_FILE_NOT_FOUND)を返しています。

メイン部分は以下のとおりです、ご質問の内容とほぼ1対1に対応しているので、動作が異なることはないと思うのですが・・・

  HANDLE hToken = NULL;
  HANDLE hFile = NULL;

  PCSTR pszUserName = m_sUser;
  PCSTR pszDomainName = ".";
  PCSTR pszPassword = m_sPassword;
  PCSTR pszFilePath = m_sFilename;

  try {
    do {
      if (LogonUser(pszUserName,
            pszDomainName,
            pszPassword,
            LOGON32_LOGON_INTERACTIVE,
            LOGON32_PROVIDER_DEFAULT,
            &hToken)) {
        if (ImpersonateLoggedOnUser(hToken)) {
          hFile = CreateFile(pszFilePath,
                  GENERIC_READ,
                  FILE_SHARE_READ,
                  NULL,
                  OPEN_EXISTING,
                  SECURITY_SQOS_PRESENT | SECURITY_EFFECTIVE_ONLY,
                  NULL);
          if (!RevertToSelf()) {
            MessageBox("RevertToSelf() failed");
          }
          if (hFile != INVALID_HANDLE_VALUE) {
            CloseHandle(hFile);
            MessageBox("OK");
            break;
          }
        }
      }
      CString s;
      s.Format("error:%d\n",GetLastError());
      MessageBox(s);
    } while (0);
  } catch(...) {
  }

なお、テストにはWindows 2000 Workstationを使用していますが、Windows XP Professionalでも同様の結果です。

ファイル不存在時の件ですが、こちらではファイル不存在時にはCreateFileでエラーとなりGetLastError()が2(ERROR_FILE_NOT_FOUND)を返しています。

メイン部分は以下のとおりです、ご質問の内容とほぼ1対1に対応しているので、動作が異なることはないと思うのですが・・・

  HANDLE hToken = NULL;
  HANDLE hFile = NULL;

  PCSTR pszUserName = m_sUser;
  PCSTR pszDomainName = ".";
  PCSTR pszPassword = m_sPassword;
  PCSTR pszFilePath = m_sFilename;

  try {
   ...続きを読む

QC ファイル出力で、フォルダがない場合でも作成する方法

先日、皆さんに教えていただき

Cで出力ファイルを指定のフォルダに出す方法が上手く出来ました。
具体的には、↓こうやって指定しました。
sprintf( buff, "%s\\%s", path, filename );

やっていて思ったのですが、
この方法だと、指定フォルダが最初から無いとエラーが出てしまいます。
フォルダが無かったら、作成し、その中にファイルを出力していってくれる。という方法はできるものなのでしょうか?

もしできるようなら教えて下さい!!
よろしくお願いします!

Aベストアンサー

★回答ではないが余談。
・koko_u_ さんありがとう。
 気づくとアンダーバーの関数名で置き換わっているみたいですね。
 他にも気づくといろいろ置き換わっていますね。
 C 関数、最近使っていないのでアンダーバーの関数名で調べてみます。
・ありがとうございました。

●質問者さんへ。
・_mkdir() 関数が使える場合はその関数でもフォルダ(ディレクトリ)が作成できます。
 それでは。

参考URL:http://www5c.biglobe.ne.jp/~ecb/c/12_14.html

Qsleep()関数について

"数秒おきに警報をn回鳴らすプログラム"をC言語で作成しようと
考えています。

プログラム実行環境はWindowsですが、
sleep()関数は使用できないのでしょうか??

仮に使用できない場合、この関数に代わる関数や代替方法が
あれば教えて頂けませんでしょうか? 宜しくお願いします。

Aベストアンサー

正確な動作でも構わなければ
windows.hをインクルードして
Sleep()関数を使いましょう.
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200207/02070061.txt

しかし,正確に数秒おきに動作を行いたい場合はマルチメディアタイマ等を使いましょう.
マルチメディアタイマはミリ秒間隔でコールバック関数を呼び出すことができます.
timeSetEventを用いてコールバック関数の登録を行うことができます.
timeKillEventでコールバック関数の解除を行うことができます.

多分他にも方法があると思うのですが…私はこれぐらいしか知りません^^;

参考URL:http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/time.html

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Qfgetsで拾われる改行文字を削除したい

お世話になります

 C言語初心者のものです。今課題でC言語を用いたプログラミングを
Fedora上でやっています。問題は、fgetsでテキストファイルから、取得
した文字列の中から改行文字を削除できないことです。文字変数のアド
レスはわかっているのですが、終端文字に置換しようとすると、セグメ
ントエラーになってしまいます。これは如何にして解決すべきでしょう
か。よろしくお願いします。

Aベストアンサー

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが最大文字数に達したり、ファイルの最後になったりで、strに改行文字が含まれない場合には、このループは止まりません(Segmentension Falutになって止まる)

・そのような状態になってないか、予めチェックする
・ループを終了させる仕組みを用意しておく
: forの終了条件を記述する、for中で if(*(str+i)=='\0') { break;} 等としておく、等
といった対策が必要です。


あと細かいところを言えば
・strを配列で用意したなら *(s+i)じゃなくてs[i]でいいんじゃないかな
・あるいは char *pみたいにしておいて、 iのループでなく pでループを組む( for(p=str;*p!='\0';p++) )とか。

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが...続きを読む

Qchar*を初期化したいのですが

Cの標準関数だけで
char*を初期化したいのですが
どの様にすればいいのでしょうか?

char* a = "aaaa";
char* b = "bbbb";
strcat( a, b );//"aaaabbbb"?
とし使いまた後で
aにまた値を入れ直したいので
初期化して再利用したいのですが

どのようにすればいいのでしょうか?

ポインタとかもうっすら(ほとんどわかりません)
よろしくお願いいたします

Aベストアンサー

> char* a = "aaaa";
> char* b = "bbbb";
> strcat( a, b );//"aaaabbbb"?
この上のコードは間違っていますよ。
変数a、bに入っているのはあくまでも文字列の"ポインタ"です。
従いまして、strcat( a, b );とすると、aがさしているメモリは5バイトしかないのでメモリを破壊してしまいます。
static char sza[] = "aaaa";
static char szb[] = "bbbb";
char szBuffer[256];
char* a = szBuffer;
strcpy (a, sza);
strcat (a, szb);
としないとだめです。

またポインタ変数はNULLで初期化可能です。

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);


人気Q&Aランキング