1

Linux で名前付きパイプを介してメッセージを交換する単純な C プログラムを作成しています。問題は、それを機能させるためにスーパーユーザーとして実行する必要があることです。そうしないと、「許可が拒否されました」というエラーが表示されます。ディレクトリに対する書き込み権限が付与されます。

drwxr-xr-x 2 alpa alpa  4096 26 giu 17.24 .

umask は問題ないはずです:

$ umask
0022

パイプ ファイルは実際に作成されますが、パーミッション ビットが間違っています。

$ ls -l | grep fifo.fifo
pr----x--t 1 alpa alpa     0 26 giu 17.29 fifo.fifo

そのため、読み取りまたは書き込みのためにそれを開こうとすると、open() システム コールが失敗します。

コードは次のとおりです。

...
if(mkfifo(pathname, perms) == -1 && errno != EEXIST)
  return NULL;
if(chmod(pathname, perms) == -1)
    return NULL;
...
fifo->fd[0]= open(fifo->pathname, O_RDONLY);
 if(fifo->fd[0] == -1){
fifo_delete(&fifo);
  return NULL;
...

よろしくお願いいたします。

4

2 に答える 2

3

渡す値は decimal666で、これは 8 進数01232(01210適用後~umask) に対応します。

0666または decimal のいずれかを渡す必要があります438

于 2012-06-26T16:01:42.550 に答える
0

これは、読み取り専用の fifo を作成しているからではありませんか? スニペットで mkfifo を呼び出すためのパラメーターがわかりません。しかし、「man 3 mkfifo」が言うことは次のとおりです。

通常の方法で、プロセスの umask によって変更されます。作成されたファイルのパーミッションは (mode & ~umask) です。

umask はここでは制限要因にすぎないため、モードが正しいことを確認してください。

于 2012-06-26T15:51:28.580 に答える