unixでファイルロックを試みているのですが、うまくいきません。open関数で得たファイル指定子にlockfを用いてみたのですがうまくいきません。ロックはされているようなのですが、他からファイルに書き込みができてしまうのです。
 flockやO_EXLOCKなどは、使えないのです。誰か、「こうすればいい!」といえる方、教えてください。

A 回答 (3件)

下記ページが非常に参考になると思います。


ご一読ください。

参考URL:http://tohoho.wakusei.ne.jp/wwwcgi8.htm, http://www.din.or.jp/~ohzaki/perl.htm#File_Lock
    • good
    • 0

僕も同じ事で悩んだことがあるのですが、他の書き込もうとするプロセスはlockfを使っていますか?


どうやらlockf等の関数は書きこみ自体を禁止にするのではなく排他制御のためのお約束みたいなもので、無視してしまえば当然のごとく?書込みできてしまうのではないかと思っています。・・・はっきりいって自信ありません。
便乗になってしまいますが、詳しい方いらしたら正確な事を教えて頂けないでしょうか?
    • good
    • 0

unixにおけるファイルロックはいくつかの種類があり、互換性はありません。


lockf(3):Posix.1準拠
flock(2):BSD準拠
fcntl(2):F_GETLKフラグはSVr4, SVID, POSIX, X/OPEN, BSD 4.3. Posix.1(ただし、仕様の記述があるだけで機能するという保証は無い)

御利用のUNIXはどの仕様に準拠しているのか教えて下さい。

この回答への補足

私が使っているunixの仕様はよく分からないのですが
HP-UX(ヒューレット・パッカード社の開発)
で、BSDよりはSVr5に近い?という話です。
これで何かわかりましたら、お手数ですが
もう一度お願いします。

補足日時:2001/07/30 21:02
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

QUNIX上でのファイルopenについて

C言語で同一ディレクトリから複数のファイルを順番に読み込んでいきたいのですが、うまくいきません。
シェルで、ファイル名の取得を行っていっています。
shell
----
ls /home/data > /home/src/infile.txt
----
C
-----------------------------
FILE *fp;
char y[30]="/home/data/";
// ↓aには上記シェルにて取得した1件目のファイル名が入っています。
strcat(y,a);
// ↓ここでは絶対パスが正しく表示されます
printf("ddd:%s\n",y);
// ddd:/home/data/11.txt
// ↓ここでfile open errorで一件目で終了してしまいます。
if ((fp = fopen(y,"r")) == NULL){
printf("file open error!!\n");
exit(1);
}
-----------------------------
このようなファイルの読込みのやり方ができるのか教えてください。
もしできるのであるのなら、そのやり方も教えてください。
わかりにくい文章ですが、お願いします。

C言語で同一ディレクトリから複数のファイルを順番に読み込んでいきたいのですが、うまくいきません。
シェルで、ファイル名の取得を行っていっています。
shell
----
ls /home/data > /home/src/infile.txt
----
C
-----------------------------
FILE *fp;
char y[30]="/home/data/";
// ↓aには上記シェルにて取得した1件目のファイル名が入っています。
strcat(y,a);
// ↓ここでは絶対パスが正しく表示されます
printf("ddd:%s\n",y);
// ddd:/home/data/11.txt
// ↓ここでfi...続きを読む

Aベストアンサー

こんにちは。

 まず、aliasと打って、lsコマンドに余分な別名が付いていないか確認してください。付いている場合、\lsとして、aliasをパスします。"alias ls 'ls -F'"などとしてあると、*などの余分な文字がくっつきます。また、厳密には"\ls -1 >"とします。-1は、1カラムで表示するというオプションです。

 次にyの配列数ですが、PATH_MAXという定数がありますので、こちらを使用してください。

 それから数件表示/オープンするのであれば、strcatでyに連結すると、次のデータはどうなると思いますか?

 オープンが失敗する理由ですが、viコマンドでそのファイルをオープンできますか?つまり、実行ユーザにリードのアクセス権がありますか?また、デバッガで止めて、確実に目的のファイルを指していることを確認してください。

 最後に、「プログラミング言語C」第2版はお持ちでないですか?
http://www.pro.or.jp/~fuji/computerbooks/c/c.kernighan.html
お持ちでないなら、本屋に急行してください。C言語を作った人によるC言語の本で、「Cのバイブル」、「KR本」とも言われるものです。この中に、外部コマンドからファイル名をもらわなくても、ディレクトリの内容を再帰的に表示するプログラムの例があります。

こんにちは。

 まず、aliasと打って、lsコマンドに余分な別名が付いていないか確認してください。付いている場合、\lsとして、aliasをパスします。"alias ls 'ls -F'"などとしてあると、*などの余分な文字がくっつきます。また、厳密には"\ls -1 >"とします。-1は、1カラムで表示するというオプションです。

 次にyの配列数ですが、PATH_MAXという定数がありますので、こちらを使用してください。

 それから数件表示/オープンするのであれば、strcatでyに連結すると、次のデータはどうなると思いま...続きを読む

Qファイルを読み込んで出力するプログラムがうまくいきません・・

☆☆☆☆☆☆☆☆結局わからないこと☆☆☆
4でかいたように配列のように出力するのは簡単ですが、そのファイルを開き配列として認識させるにはどうすれ
ばいいかなあと悩んでるわけであります。
fscanfを使えばいいのはわかるのですがどうもうまくいかない・・・・
☆☆☆☆☆☆☆☆
どうかアドバイスよろしくお願いします。

Aベストアンサー

確かに、fscanfで良いはずですが、その前に
fscanfでフィールドを区切れるように、fprintf
で出力する際にfprintf(fp, "%0x ", y)のよう
にスペース区切りにしてはどうでしょうか。

たしかscanf系のデフォルトのフィールドセパ
レータはスペースとタブだったように思います。

QUnicodeのファイル読み込みがうまくいきません。。

下のようなコードで読もうとしているんですが、どうしても文字化けしてしまいます。原因が何なのかさっぱりわかりません。。
分かる方どうかお願いします!開発環境はVC++.NETです。

FILE* fin;
wchar_t c;
CString ss;

if( (fin = fopen( "temp.txt", "r" )) == NULL ){
AfxMessageBox("temp.txtファイルオープンエラー");
exit(1);
}

fgetws( &c, 2, fin );
ss += c;
AfxMessageBox(ss);

Aベストアンサー

fgetwsを呼び出す前に、setlocale(LC_CTYPE, "");を実行してください。

それともう一点、cは1文字しか格納できないのに、サイズに2を指定しているのは間違いです。

Qlockfについて

lockfでファイルをロックしているのですが
他のプロセスから読み書きができてしまいます。
lockfとはファイル自体に読み書き禁止する関数ではないのでしょうか?
それとも他のプロセスからも全てlockfをする使い方が正しいのでしょうか?
OSはHP-UXです。
よろしくお願いします。

Aベストアンサー

再び#2です。
確かにlockf()はO_RDONLYではダメかもしれませんね。
ファイル全体のアドバイザリロックでいいのなら、flock()の方が簡単ですよ。
簡単なサンプルを提示しておきます。
--
// for read
int get(const char * fileName)
{
int rtn;
FILE * fp = fopen(fileName, "r");
if (fp == NULL) return -1;
// 読んでる間に読むのはいいが、書くのは許さん
if (flock(fileno(fp), LOCK_SH) != 0) return -1;
if (fscanf(fp, "%d", & rtn) < 1) return -1;
flock(fileno(fp), LOCK_UN);
fclose(fp);
return rtn;
}
// for write
int set(const char * fileName, int value)
{
FILE * fp = fopen(fileName, "w");
if (fp == NULL) return -1;
// 書いている間は書くことも読むことも許さん
if (flock(fileno(fp), LOCK_EX) != 0) return -1;
if (fprintf(fp, "%d\n", value) < 0) return -1;
if (fflush(fp) < 0) return -1;
flock(fileno(fp), LOCK_UN);
fclose(fp);
return 0;
}
--
注:
・ストリームを使った出力の場合、フラッシュしない限り書き出しが留保される可能性があるのでロック解除前に必ずフラッシュすること。
・このサンプルではエラー時にファイルをクローズしていない。
・このサンプルではブロックが発生する。必要ならLOCK_NBをorすること。
・flock()が使えずfcntl()が使えるなら、簡単なラッパ関数を用意すればflock()互換にできる。

再び#2です。
確かにlockf()はO_RDONLYではダメかもしれませんね。
ファイル全体のアドバイザリロックでいいのなら、flock()の方が簡単ですよ。
簡単なサンプルを提示しておきます。
--
// for read
int get(const char * fileName)
{
int rtn;
FILE * fp = fopen(fileName, "r");
if (fp == NULL) return -1;
// 読んでる間に読むのはいいが、書くのは許さん
if (flock(fileno(fp), LOCK_SH) != 0) return -1;
if (fscanf(fp, "%d", & rtn) < 1) return -1;
flock(fileno(fp), LOCK_UN);
fclose(f...続きを読む

QUNIX C ファイル出力

UNIX Cにてあるテキストファイルの中身(1行分)を、別のテキストファイルに出力したいのですが、どうすれば、いいでしょうか。
例。A.txt
123 yano 200612
  ↓
B.txt
123 yano 200612

Aベストアンサー

★サンプルを紹介しましょう。

/* 区分が '0' のレコードだけを、B.txt に書き出す処理 */
static void ZeroRecordOutput( FILE *fp, FILE *fo )
{
 char buff[ BUFSIZ ];
 
 while ( fgets(buff,BUFSIZ,fin) != NULL ){
  if ( buff[0] == '0' ){ ←区分が '0' だから!
   fputs( fo, buff );
  }
 }
}

引数:
・fp は入力ストリーム(A.txt)のファイル・ポインタです。
・fo は出力ストリーム(B.txt)のファイル・ポインタです。
・どう。簡単でしょう。
・行単位で入出力すると簡単に処理できますよ。

補足:
・回答者 No.1 ~ No.7 さんの回答&アドバイスをよく読みましょうね。
・最後に人に頼りすぎないように!頑張りましょう。では、さようなら。


人気Q&Aランキング

おすすめ情報