1

私はシェルスクリプトとacプログラムを持っています

    #!/bin/bash
    for i in `seq 1 10000`
    do
    (flock -x 200                   // what is 200?
       ./taskA
    ) 200> lockfile
    done

C プログラムでは、関連するコード スニペットは次のとおりです。

    int fd = open("lockfile", O_WRONLY|O_CREAT); // what permission should I put here?
    for(i=0;i<10000;i++){
      if(fd==-1)
            printf("open file fails\n");

      if(flock(fd, LOCK_EX)==0 ){      // lock the file
            taskB(); // here is what I want to do
            }

      if (flock(fd, LOCK_UN)==0)  // after finishing those tasks, unlock it
      {
            printf("C unlock\n");
      }
     }

taskAシェル スクリプトと C プログラムを同じホストで実行したいのですが、別の時間に交互に実行できることを願っていますがtaskB、flock に慣れていないため、アクセス許可の問題やファイルを開くのに失敗することがあります。

たとえば、C プログラムを実行して終了させて​​から再度実行すると、「ファイルを開くのに失敗しました」というメッセージが表示され、パーミッションは次のようになります。

---xr-x--T 1 esolve 200036    0 May  6 02:18 lockfile

スクリプトとコードを変更する方法 ありがとう!

4

1 に答える 1

2

シェル スクリプトの 200 はファイル記述子です。 のマニュアル ページを参照してくださいflock(1)

ファイルのアクセス許可に関する問題は、open(2)含めるときに3つの引数を取ることですO_CREAT; 3 番目の引数は、ファイルのアクセス許可にする必要があります。3 番目の引数を指定しない場合は、準ランダムな値が選択されます。open(2)署名があるため、その問題を検出するには多くの分析が必要です。

#include <fcntl.h>

int open(const char *path, int oflag, ...);

これは可変長の引数リスト関数であるため、ほとんどの場合、引数を 2 つだけ使用しても問題ありませんが、O_CREATが指定されている場合は 3 番目の引数が必要です。

于 2013-05-06T05:50:33.233 に答える