掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.24975

オープンしたファイルのロック
投稿者---べた(2005/12/26 16:54:01)


ファイルのロックについて教えて下さい。

Aプログラムから”w”モードで、fopenしたファイル
にロックを掛け、Bプログラムからロックを掛けた同じ
ファイルをオープンし、書込みできないようにしたい
のですが、上手くいきません。ファイルへの書込みには、
fprintfや、fputs等を使用しています。
ファイルのオープンエラー、書込みエラーにしたいのですが
可能なのでしょうか。

環境は、
Solaris8
UNIX-C
gcc
gcc -o 実行モジュール ソースファイル

ソース1
/* ファイルをロックするソース */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc,char *argv[])
{
    FILE *fp ;

    if (argc != 3) {
        printf("%s file_name LOCK_Second_time\n",argv[0]) ;
        exit(-1) ;
    }

    if ((fp = fopen(argv[1],"w")) == NULL) {
        fprintf(stderr,"Can't open %s\n",argv[1]) ;
        perror(argv[1]) ;
        return(-1) ;

    }

    if (lockf(fileno(fp),F_LOCK,0) == -1) {
        perror("lockf") ;
        return(-1) ;
    }

    printf("File Lock %s\n",argv[1]) ;
    sleep(atoi(argv[2])) ;

    fclose(fp) ;

    if (remove(argv[1])) {
        perror("remove") ;
        return(-1) ;
    }

    return 0;
}



ソース2
/* ファイルへの書込みのソース */

#include <stdio.h>

int main(int argc,char *argv[])
{
    FILE *fp ;
    int i ;

    if (argc != 2) {
        printf("%s file_name\n",argv[0]) ;
        exit(-1) ;
    }

    if ((fp = fopen(argv[1],"w")) == NULL) {
        fprintf(stderr,"Can't open %s\n",argv[1]) ;
        perror(argv[1]) ;
        return(-1) ;
    }

    for(i=0; i<10; i++) {
        fprintf(fp,"%s\n","abcde12345" ) ;
    }

    fclose(fp) ;

    return 0;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:オープンしたファイルのロック 24983 TJ 2005/12/27 00:37:05


No.24983

Re:オープンしたファイルのロック
投稿者---TJ(2005/12/27 00:37:05)
http://home.f01.itscom.net/toge/programingreport/


ファイルのロックなどはC言語でやったことがなくレスをするのもおこがましいのですが、素人考えが役に立つ時もあるかも知れないと思って書き込みます。

  if ((fp = fopen(argv[1],"w")) == NULL) {
    fprintf(stderr,"Can't open %s\n",argv[1]) ;
    perror(argv[1]) ;
    return(-1) ;
  }

  if (lockf(fileno(fp),F_TLOCK,0) == -1) {
    perror("lockf") ;
    return(-1) ;
  }



ソース2の方で、上のようにしてみました。
これだとfopen時ではありませんが、一応エラーがでるのですが。


この投稿にコメントする

削除パスワード

No.24989

Re:オープンしたファイルのロック
投稿者---べた(2005/12/27 13:40:32)


ありがとうございます。

試して見ました。
確かに、lockfで止めることができました。

両方のプログラムに、lockf関数が必要なんですね。
また、ロックの機能も、 F_LOCK ではなく、 F_TLOCK でないと
いけないのですね。

lockf関数を呼び出していないプログラムでは、無理と言うこと
ですか。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧