• 締切済み

Cでファイルのロック元の情報を出力するには

ファイルのロックに関する情報を表示するプログラムを作ろうとしています。 flock構造体のl_pidが、ロックしているプロセスのIDだということまでわかりました。 このl_pidから、ユーザや起動コマンド等を知るにはどうすればいいのでしょうか。

  • sunny
  • お礼率66% (2/3)

みんなの回答

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.1

多分OS依存になると思うので,OSが判らないと決定できないように思います。 LinuxやFreeBSDのようなソースにアクセスできるOSなら、 psのソースを調べるのがてっとり早いと思いますが。 procfsを使う手もあるかも知れません. http://www.idg.co.jp/sw/back/series/200012_01_kernel.html

参考URL:
http://www.idg.co.jp/sw/back/series/200012_01_kernel.html
sunny
質問者

補足

ありがとうございます。AIXを使用しています。その場合、無理ということでしょうか。

関連するQ&A

  • ロックファイルが消える

    ファイルロックにflockを使っているのですが、複数のファイルを扱うので、データファイルにロックをかけるのではなく別途「ロックファイル」に対してロックをかけています。 データファイルであれば読み書きモードで開く必要がありますが、ロックファイルは中身はどうでも良いので、 open(LOCK,"> $lockfile") or die ~ というように上書きモードで開いて良いとする解説を読んだので、そのようにしています。 しかし、ごくたまにロックファイルが消えてしまう現象が発生します(なかなか再現できずに条件など特定できず)。 あくまでもファイルの中身が壊れるとかいうことではなくて、ファイルそのものが消えます。 そこでお聞きしたいのですが、 1. ロックをかけたファイルが何らかの原因で消えた場合、ロック状態も消失してしまう(他プロセスがロックできてしまう)のでしょうか? 試してみたのですが、  まずプロセスAがロックをかけて  プロセスBが同ファイルにロックをかけようとすると、失敗する  プロセスAがロック解除せずにファイルを削除する  それでもプロセスBはロックに失敗する  プロセスAが(もう存在しないファイルの)ロックを解除(close)する  するとプロセスBはロックに成功する ということは分かったのですが、上記を、プロセスAがファイルを削除した後にプロセスBを動かすと、どういうわけかロックに成功してしまいます。 2. 複数プロセスが同時に上書きモードでopenしようとするのが消える原因なら、ロックファイルであってもやはり読み書きモードで開くべきなのでしょうか。そしてそれなら消えることは無いのでしょうか。 (読み込みモードではロックできないという解説もありました。) 御教授のほどよろしくお願いいたします。

  • ロックの情報取得

    ロックの情報を取得したいのですがどのようなコマンドを実行すればよろしいでしょうか? ロック  どのファイルがどのプログラムによってロックされているか? ご教授の程、宜しくお願いいたします。

  • 【ruby】flockで掛けたロックを参照したい

    複数プロセス間で、一つのファイルに対して読み書きしたいです。 その際、ファイルへの書き込み中は、ファイルの読み込みを抑止したいです。 また、読み込みの処理はファイルのロックを参照するだけで、ファイルへのロックは掛けない様にしたいです。 そこで、以下二つプログラムを作成して、簡単な検証を行いました。 ■プログラム1 キーボードからの入力があるまで、ファイルをロックする。 #!/usr/local/bin/ruby file='./hoge.txt' f=open(file,'r+') ret=f.flock(File::LOCK_EX|File::LOCK_NB) STDOUT.write 'Hit any key' STDIN.gets.chomp ■プログラム2 ファイルがロックされているか状態を取得する。 #!/usr/local/bin/ruby require "fcntl" file='./hoge.txt' f=open(file,'r') arg="" f.fcntl(Fcntl::F_GETLK,arg) l_start,l_len,l_pid,l_type,l_whence = arg.unpack('VVVSS') puts l_len ※プログラム2は、fcntlの使い方がマニュアルを読んでもよく理解できなかったので、 手探りで記述しました。 実行すると、プログラム1はエラー無く動きましたが、プログラム2は以下の様なエラーが 出てしまいます。 fcntl.rb:6:in `fcntl': Invalid argument - ./hoge.txt (Errno::EINVAL) from fcntl.rb:6 環境は、unixレンタルサーバ(FreeBSD)です。 上記方法では、上手くいきませんでした。 flockでファイルにロックが掛っているか否かを、そのファイルにロックを掛けることなく 調べるにはどうしたら良いのでしょうか? ご指導のほど、宜しくお願いいたします。

    • ベストアンサー
    • Ruby
  • file()を使う時のファイルロック

    たいていの場合は問題ないのですが、 アクセスカウンタ等の更新の激しい物の場合、 file()やfile_get_contents()でファイルを開き、 その内容を元にfopen()・flock()・fputs()等を使って書き込むと、 データが破損してしまう事があります。 これはロック中でもfile()等では開けてしまうのが原因だと思いますが、 file()等を使う際の排他処理はどのようにしたら良いのでしょうか。 ロック中は、fopen()の前で解放されるのを待つ仕様なようなので、 $fp=fopen("ロック用ファイル","r"); flock($fp,LOCK_EX); ~複数のファイルの読み書きを含めた、様々な処理~ fclose($fp); としてみたのですが、これで排他処理は完璧になるでしょうか? これまでは、 1. ロック用ファイルが存在する場合、なくなるまでsleep() 2. 空のロック用ファイルを作成 ~複数のファイルの読み書きを含めた、様々な処理~ 3. ロック用ファイルを削除 としていたのですが、これでは度々破損してしまいました。 「1」と「2」の間で、新しいプロセスが「1」に割り込んで来てしまうせいでしょうか。 そうだとすれば、fopen()とflock()の間でも 同じ事が起きてしまう気がするのですが、どうなんでしょうか。

    • 締切済み
    • PHP
  • PerlとPHPで同一ファイルをファイルロック

    PerlとPHPで同一のファイルを読み書きする必要があるのですが、ファイルロックする機構を作るには互いの言語でmkdirで対応したほうがよいのでしょうか? flock関数がPerlにもPHPにもありますが、これは、PHPのプロセスで実行したロックの状態をPerlで検知したり、または逆のことはできないのでしょうか? もしできないとするとmkdirで同一の機構を作ったほうが良い気もしますが、何か問題などは起きないでしょうか。

    • ベストアンサー
    • PHP
  • c言語でプロセスIDを調べたい

    unixのコマンドで ps aux と打つと "ユーザー名" "プロセスID"  。 。 。 。 がでますけど、この2番目の"プロセスID"を調べる関数ってありますか? ※というのも、プロセスID(ジョブ番号)を引数にして、そのプロセスが終了したら何か処理をさせるというプログラムを作りたいからです。よろしくお願いします。

  • 子プロセスと親プロセス

    ある本を読んでいると、以下のような問いにぶち当たり、プログラムの仕方がよくわからないのです。 自分でもいろいろ調べたのですが、わからないので質問させていただきます。 自分のプロセスIDと親のプロセスIDのプロセスIDを表示するコマンドshowpidを作り、showpidを子プロセスとして10回実行するプログラムを作りなさい。ただし、execを用いてshowpidを10回実行すること。 というものなのですが、自分のプロセスIDと親のプロセスIDの表示方法はわかったのですが、それをコマンドとして作り、子プロセスとして10回実行する方法がわからなくて困っております。。。 言語はc言語を使ってもらいたいです。以下に自分のプロセスIDと親のプロセスIDを表示するプログラムを付けときます。 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main(){ pid_t pid; int status; if((pid=fork())==0) printf("I am a child with pid=%d. My parent pid is %d.\n",getpid(),getppid()); else{ wait(&status); exit(EXIT_SUCCESS); }

  • ロックされたファイルを再起動せずに強制解除する方法

    WindowsServer2003をファイルサーバとして利用しているのですが、共有フォルダ内の複数ユーザが書き込みをするファイルが、ときどき書き込みできなくなってしまいます。 具体的には、「行先掲示板CyuHi2000」という在席状況を管理するフリーソフトを使って、約30人程度が同じファイルを閲覧・書き込みする環境なのですが、その掲示板ファイルが書き込みできなくなってしまいます。 サーバ側で、削除しようとすると、「xxxを削除できません。ほかの人またはプログラムによって使用されています。ファイルを使用している可能性があるプログラムをすべて閉じてからやり直してください。」と出て、削除できません。 オープン中のプログラムを見つけ出して強制解除するフリーソフト「UnLocker」や削除できないファイルを強制削除するフリーソフト「強削」などを使ってみましたが、削除できませんでした。 Windows2003の標準機能で、「openfiles」というコマンドがあったので、それを使ってどのプロセスが利用しているのか調べてみましたが、そのファイルをオープンしているプロセスは見つかりませんでした。 サーバを再起動すると改善するのですが、昼間に再起動できないサーバのため、再起動せずに解決する方法はないか調べています。 再起動せずに強制削除・ロック解除する方法は無いでしょうか。

  • Excelファイルがロックされて解除できません。

    Excelファイルがロックされて解除できません。 Excel起動中におかしくなった為か、 ファイルを開いてもないのに、開こうとすると 「・・xlsは編集のためロックされています」と出てしまいます。 尚、ファイルはサーバー上に置いてます。 1.ロックを掛けた、ローカルマシンを再起動しました。 2.c:\documents and Settings\ユーザ\Local Settings\Tempのファイルを 別の場所に移動させました。(但し全てのファイルを移動できなかった) 3.コマンドプロンプトのdelコマンドを試しました。 1~3を試したんですが、ロックが解除できません。 Excelは Excel2003 SP3 OfficeはWindowsXP ServicePack3 です。 ロック解除又はファイルを削除したいです。 何か解決する方法はあるでしょうか?

  • PHPのファイルロックについて

    関数flock();について調べてたのですが、 結局、イマイチ使い所がわかりませんでした。 とりあえずCGIを手本として以下のロックを作ってみたのですが、 もし、flockを使うとしたらどのように使うのかアドバイスして欲しいと思っています。 ↓参考プログラム(echo部は進行を表示するためのもの) <?php define ("LOCK_FILE","./lock/lock.txt"); Lock(); Unlock(); //ロック function Lock(){ if(file_exists(LOCK_FILE)){ if(date(U) - filemtime(LOCK_FILE) > 30){ unlink(LOCK_FILE); echo("古いロック削除<br>"); } } $retry = 5; while(file_exists(LOCK_FILE)){ if($retry <= 0){ echo ("error<br>"); exit; } $retry--; sleep(1); } $lockfile = fopen(LOCK_FILE,"w"); fclose($lockfile); echo("ロック完了<br>"); } //アンロック function UnLock(){ unlink(LOCK_FILE); echo("ロック解除<br>"); } ?>

    • 締切済み
    • PHP

専門家に質問してみよう