プロが教えるわが家の防犯対策術!

FTPで書き込み中のファイルがあるとします。そのファイルが、書き込み中なのか、それとも、書き込みが完了したのかを、知りたいのですが、良い方法はありますでしょうか。書き込みファイル名はあらかじめ、わかっています。(書き込み中に読んだ場合、最後まで読み切ることが出来ないために書き込み完了迄待ちます)当方で、調査した限りでは、ファイル名を指定して、そのファイルが、他プロセスによってオープンされているか否かを知るシステムコールは存在しませんでした。OSは、sun solaris10を使用の予定ですが、UNIX系(linux含む)で実現可能であれば、かまいません。

A 回答 (13件中11~13件)

あぁ。

。すみません^^ ファイルをコピーするのか勘違いしてました^^; link()、unlink() を使ってやるなら大丈夫そうですね。
    • good
    • 0

なるほど、そういうことでしたか^^



わたしなら、ファイルサイズを受け取るか、tatsu99 さんの1案を採用しますね。2案はレースコンディションがありそうですし。。3案は、ターゲットのファイルの種類が決まっていて、終了文字がきちんと決められるなら一番簡単な方法ですね。

tatsu99 さんの、1案が一番確実・簡単でいいですかね。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
>2案はレースコンディションがありそうですし。。
とのことですが、具体的にどのような状態を想定されてますでしょうか?

お礼日時:2007/09/07 22:45

fopen(ファイル名,"r+")


オープンできれば書き込み終了、失敗ならば書き込み中。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。提示していただいた方法を当方にて確認しましたところ、他のプロセスが、書き込み中でも、正常にオープン出来てしましました。
以下、書き込み側のソースです。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>

int main(int argc , char *argv[])
{
FILE *fp;
char area[256];
int i = 0;
if (argc == 1){
printf("%s 書き込みファイル名\n",argv[0]);
exit(0);
}
fp = fopen(argv[1],"w");
if (fp == NULL){
printf("fopen error\n");
exit(0);
}
while(1){
sprintf(area,"===============%d================\n",i++);
if (fputs(area,fp) == EOF){
printf("fputs error\n");
exit(0);
}
if (fflush(fp) == EOF){
printf("fflush error\n");
exit(0);
}
printf("%d完了\n",i);
sleep(10);
}
fclose(fp);
return(0);
}
以下、読み込み側のソースです。
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>

int main(int argc , char *argv[])
{
FILE *fp;
char area[256];
int i = 0;
if (argc == 1){
printf("%s 読み込みファイル名\n",argv[0]);
exit(0);
}
fp = fopen(argv[1],"r+");
if (fp == NULL){
printf("fopen error\n");
exit(0);
}
printf("オープン成功\n");
fclose(fp);
return(0);
}

動作確認は
Solaris10(INTEL版)
cent-os 4.4 で行いました。

お礼日時:2007/09/07 21:49

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

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


このQ&Aを見た人がよく見るQ&A