Cプログラムから1つのファイルを作成したいのですが、Cバイナリでビットロングタイムを使用したいです。しかし、Cプログラムが作成されたファイルの処理を終了してロックを解除するまで、誰も(vimまたは他のエディターを使用している可能性があります)ファイルの内容を開いて読み取ることができないようにファイルを作成したいと思います。
このおかげで事前に私を助けてください。
Cプログラムから1つのファイルを作成したいのですが、Cバイナリでビットロングタイムを使用したいです。しかし、Cプログラムが作成されたファイルの処理を終了してロックを解除するまで、誰も(vimまたは他のエディターを使用している可能性があります)ファイルの内容を開いて読み取ることができないようにファイルを作成したいと思います。
このおかげで事前に私を助けてください。
この目的のために、Unix で必須のファイル ロックを定義できます。ただし、強制ロックを有効にするために、ファイル システムを (再) マウントする必要があります。
1 たとえば、ルート fs を再マウントするには、(root として) 以下を使用します。
mount -oremount,mand /
2 それでは、シークレット ファイルを作成しましょう。
echo "big secret" > locked_file
3 set-group-id を設定し、ファイルに対するグループ実行権限を無効にする必要があります。
chmod g+s,g-x locked_file
そして、そのファイルをロックする C コード: (コードはファイルをロックし、しばらくロックしたままにします。別の端末で読み取ろうとすると、ロックが解除されるまで読み取りが遅れます)
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main() {
struct flock fl;
int fd;
fl.l_type = F_WRLCK; /* read/write lock */
fl.l_whence = SEEK_SET; /* beginning of file */
fl.l_start = 0; /* offset from l_whence */
fl.l_len = 0; /* length, 0 = to EOF */
fl.l_pid = getpid(); /* PID */
fd = open("locked_file", O_RDWR | O_EXCL); /* not 100% sure if O_EXCL needed */
fcntl(fd, F_SETLKW, &fl); /* set lock */
usleep(10000000);
printf("\n release lock \n");
fl.l_type = F_UNLCK;
fcntl(fd, F_SETLK, &fl); /* unset lock */
}
詳細については、 http://kernel.org/doc/Documentation/filesystems/mandatory-locking.txtを参照してください。
ファイルは flock() を使用してロックできます。その構文は
#include <sys/file.h>
#define LOCK_SH 1 /* shared lock */
#define LOCK_EX 2 /* exclusive lock */
#define LOCK_NB 4 /* don't block when locking */
#define LOCK_UN 8 /* unlock */
int flock(int fd, int operation);
最初のファイルは、fopen() または open() を使用して開かれます。次に、この開かれたファイルは、以下に示すように flock() を使用してロックされます
int fd = open("test.txt","r");
int lock = flock(fd, LOCK_SH); // Lock the file . . .
// . . . .
// Locked file in use
// . . . .
int release = flock(fd, LOCK_UN); // Unlock the file . . .