質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Logback

Logbackは、Javaのログ生成ライブラリです。同じログ生成ライブラリであるlog4jの後継プロジェクトであり、log4jと同様にSLF4Jというインターフェースを実装しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

4934閲覧

C言語とjavaで同じログファイルにファイル出力する際に注意するべき点

toroleaman

総合スコア95

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Logback

Logbackは、Javaのログ生成ライブラリです。同じログ生成ライブラリであるlog4jの後継プロジェクトであり、log4jと同様にSLF4Jというインターフェースを実装しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/04/30 05:01

編集2018/04/30 06:09

javaの複数のプロセスからログ出力する際に排他制御を行うため、
Logback + SLF4Jの組み合わせでログ出力させることにしています。
C言語からもこのログファイルにログ出力する必要があり、
Logback + SLF4Jで排他制御している仕組みを使って
C言語とjavaで排他制御して、ログ出力を行いたいと
思っています。
Logback + SLF4Jがどのような仕組みを使って排他制御を行っているか
教えていただけないでしょうか。
FileChannelというクラスを使っていますが、これらをC言語で排他することが出来ないでしょうか。

C言語で排他ロックするのは、以下のような感じでしょうか。
FILE * fp;
fp=fopen("out.log","a"));
flock(fileno(fp),LOCK_EX);
lseek(fileno(fp),0,SEEK_SET);
flock(fileno(fp),LOCK_UN);//ロックの解除
fclose(fp);

FileChannelが同じような排他方法で排他ロックしていれば、C言語とJavaで排他ロックができるのですが。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ファイルに書き込むのであれば、特別に排他制御しなくても大丈夫です
書き込みのモードでファイルをオープンしとけば、他プロセスからのファイルの書き込みオープンは失敗します。

投稿2018/04/30 05:12

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toroleaman

2018/04/30 05:18

なるほど。書き込みモードでファイルオープン失敗した場合は、1ミリ秒ほどスリープして、リトライでしょうか。C言語でファイルをオープンしている状態で、java(Logback + SLF4J)でログ出力しようとした場合、Logback + SLF4Jでは、リトライしているのでしょうか。それとも、エラーで終了してしまうのでしょうか。
otn

2018/04/30 11:41 編集

> 書き込みのモードでファイルをオープンしとけば、他プロセスからのファイルの書き込みオープンは失敗します。 それはOSによるのでは?LinuxとWindowsにはそういう機能は無さそうですが。
pepperleaf

2018/04/30 12:45 編集

Windowsは失敗します。Linuxも同じ筈。(最近、見てないのでちょっと自信は無いが) .... 失礼しました。 エラーとならないようです。 Windowsでのオープンと混じったでしょうか? 確認します。-- Unix(Linux)環境では、fctrl()等方法はあるようでしたが、Windows環境では Win32とか必要みたいでした。不確かな情報で申し訳ありません。
otn

2018/04/30 11:52

mingw32とbcc32で確認しましたが、Windowsでも多重のfopen("~","w")は成功します。
退会済みユーザー

退会済みユーザー

2018/04/30 12:50

Windows は OS仕様上ファイルロックをします。 Linuxは OS仕様上ファイルロックをしません。 だったようなきがした。 同じログに出力するんだからフォーマット合わせてるのかなこの人
otn

2018/04/30 12:55

Cコンパイラによっては、OS機能に皮をかぶせてロックする物もあるかも知れません。
toroleaman

2018/04/30 22:49

みなさん、回答ありがとうございます。OSは、Linuxです。C言語のファイルロック(flock)とJavaのFileChannelを使って排他制御できるか試してみるしかないのかと考えています。
y_waiwai

2018/04/30 22:53

えー、Linuxでファイル書き込みでロックがかからないんだったら、書き込みデータが輻輳すんの? し、しらなんだ。。
y_waiwai

2018/04/30 23:09

ちなみに、Windowsですが、ファイルOpenして失敗すれば一定時間ウェイトしてリトライさせるってことをやってますね
otn

2018/04/30 23:41

コメントを訂正します。Windowsの場合、open/fopenじゃなくて直接APIを呼べば排他モードの指定が出来ますね。open/fopenはUnix互換なので排他が掛からなかったようです。
guest

0

ベストアンサー

結局Logback+slf4j相当のものをCで書く手間がかかるし、logbackは設定によってどのようにログを出すかが変わるようですね。お勧めしません。

javaで標準入力等から受け取ったログメッセージをLogback + SLF4Jに出す小さなラッパーを書いて、それにCプログラムからログメッセージを渡すようにするのはどうでしょうか。

なお、LinuxなどUNIX系のOSであれば、複数のファイルが一つのファイルを書き込みオープンするのは出来ます。ファイルをオープンするときにO_APPENDフラグをつけておけばシステムコールレベルで交通整理してくれます。

投稿2018/05/01 03:05

a_saitoh

総合スコア702

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

javaはともかくCの基礎機能では排他制御まで考慮したファイル出力ができるとは思えません。拡張ライブラリを使用するならその仕様を調べることが必要のはずです。

投稿2018/04/30 07:33

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2018/04/30 12:43 編集

ログ出力を高頻度で更新を行わないのであれば、Cの オーブン失敗、再オープン、ログ出力、クローズで十分ではないかと思います。ただ、Java(Logback+SLF4J)がどういう仕組みでログ出力しているのか分からないので、その組合せが分からないです。ちょっと調べた限りでは、共通リソースで管理しているようなので、Cの単純 オープンとの相性は無理そうな気がしますが。 --- 失礼しました。 Cの単純Openでは排他出来なかったようです。fctrl()等の排他でした。ただ、Javaの排他との相性についてはどうかは不明ですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問