remove関数でプロセスが停止する理由とは?

このQ&Aのポイント
  • remove関数とsystem(mkdir)関数が同時に実行すると、プロセスが停止してしまう現象が発生しています。
  • この現象は、remove関数とsystem(mkdir)関数が同じディレクトリを操作しようとすることによる競合が原因です。
  • 解決方法としては、remove関数とsystem(mkdir)関数を同時に実行しないようにするか、排他制御を行うことが考えられます。
回答を見る
  • ベストアンサー

remove関数(?)でプロセスが停止する。

remove関数(?)でプロセスが停止する。 すみません。とても困っています。 ご存知でしたら、教えてください。 現在、linuxでc言語のプログラミングをしています。 元々、以下のディレクトリがあるとします。 /var/tmp/etc 2つのプロセスがあり、それぞれA、Bとします。 プロセスA内の一つのスレッドで、 remove("/var/test.dat")を実行し削除するようにプログラムしています。 また、プロセスB内の1つのスレッドで、 system("mkdir /var/tmp/etc/test1)とし、test1ディレクトリを 作るようプログラムしています。 実行し、普通に動いていたのですが、 このremove関数とsystem(mkdir)関数が同時?に実行(バッティング)すると そこでピタッと処理がとまってしまい、 (↑ログを仕込んで調べてみました。確実ではありませんが、同時に起きる時に 大体とまっていると推測しています。) /varディレクトリにすらアクセスできなくなってしまいます。 (cd var で lsコマンドを叩くと何も表示されないし、リターンもない) この現象を回避したいのはしたいのですが、 まず原因を知りたいと思っています。 remove関数とsystem(mkdir)関数が同時に走るとなぜだめなんでしょうか? すみませんが、いくら調べてわかりませんでした。 ご教示いただけると助かります。 以上、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

問題の原因は分かりませんが、ディレクトリを作るのになぜわざわざsystem()を呼ぶのかが不思議です。mkdir()を使うほうが素直でしょう。 http://archive.linux.or.jp/JM/html/LDP_man-pages/man2/mkdir.2.html

sav_moster
質問者

補足

ご回答ありがとうございます。 おっしゃるとおり、mkdir()という方法もあると思い、 system関数をmkdir()に書き換えたところ、 同じ現象が発生しました。 mkdir() と remove()は同時に使うとだめなんでしょうか?

関連するQ&A

  • remove関数(?)でプロセスが停止する。

    remove関数(?)でプロセスが停止する。 すみません。とても困っています。 ご存知でしたら、教えてください。 現在、linuxでc言語のプログラミングをしています。 元々、以下のディレクトリがあるとします。 /var/tmp/etc 2つのプロセスがあり、それぞれA、Bとします。 プロセスA内の一つのスレッドで、 remove("/var/test.dat")を実行し削除するようにプログラムしています。 また、プロセスB内の1つのスレッドで、 mkdir("mkdir /var/tmp/etc/test1, mode)とし、test1ディレクトリを 作るようプログラムしています。 実行し、普通に動いていたのですが、 このremove関数とmkdir関数が同時に実行(バッティング)すると そこでピタッと処理がとまってしまい、 (↑ログを仕込んで調べてみました。確実ではありませんが、同時に起きる時に 大体とまっていると推測しています。) /varディレクトリにすらアクセスできなくなってしまいます。 (cd var で lsコマンドを叩くと何も表示されないし、リターンもない) この現象を回避したいのはしたいのですが、 まず原因を知りたいと思っています。 remove関数とmkdir関数が同時に走るとなぜだめなんでしょうか? すみませんが、いくら調べてわかりませんでした。 ご教示いただけると助かります。 以上、よろしくお願いいたします。

  • VBのMdDir関数について。

    VisualBasic6.0で、ディレクトリを作成するようなプログラムを作成しています。 MkDirという関数を使っているのですが、関数が成功した直後、エクスプローラーが更新されず、一度ウィンドウを閉じてまた開く、という作業を行わなければ実効結果が確認できず、大変不便です。 MkDirという関数も、DOSコマンドのようで、信頼性に欠けるような気がして、、 もっと「いい関数」(エラー処理がしやすい、実行結果がプログラム中で確認しやすい関数など)って、無いのでしょうか?

  • 別のプロセスの関数を呼び出す方法はありますか?

    別のプロセスの関数を呼び出す方法はありますか? WINDOWSでプロセスAとプロセスBがあり、 プロセスBの関数ポインタをプロセスAで取得するところまではできるのですが、 この後、プロセスAからプロセスBの関数をコールバックする方法はありますか? アドレス空間はプロセスごとに固有であるため、 通常のコールバックではうまくいかないと思うのですが・・・。 尚、プロセスAとプロセスBは、異なるプログラムです。

  • Linuxで生成したプロセスに処理をさせるには?

    Linuxの学んでいる者です。 表題の件について、本を読んだり、ネットで検索したり したのですが、解決ができなかったため質問させて いただきました。 以下に例を挙げます。 1つのCファイルに、「main」と「A」と「B」という関数があるとします。 「main」関数にて、fork()で2つプロセスを生成し、一方のプロセスでは 「A」関数を実行し、もう一方では「B」という関数を実行させます。 「A」という関数は3秒ごとに「1,2,3,…」と数字を出力するもので、 「B」という関数は5秒ごとに「10、20、30、…」と数字を出力するものとします。 こういう場合に、プロセスに「A」や「B」の処理を実行させることができません。 exec関数でプロセスに別のプログラムを実行させることはできますが、 プログラムの実行ファイルのパスを指定して実行させるようなので、 この場合にはうまく使えません。 理解されている方には、本当に些細なことではあると思いますが、 私では解決にまで至らなかったので、ご教授いただければ幸いです。 よろしくお願いいたします。

  • タスクやプロセス管理について

    このカテゴリでよいか迷ったのですが質問させていただきます。 私は今までの仕事で、某セキュリティ会社の防犯監視システム開発、某携帯電話開発(UI)に携わってきました。 そこではリアルタイムOSマルチタスク環境でのプログラム開発だったのですが、マルチタスクといっても当然タスク毎に"実行可能状態"、"待ち状態"、"実行中状態"等(その他いろいろ)、各種状態を持ち、タスクプライオリティに従いOSがタスクのスケジューリングを行い順次タスクが切り替わって制御されているという感じだったのですが(何が言いたいかというと優先順位の違う複数のタスクが並列で動くことはないですよね?と言いたいのですが)、 今回LinuxOS(MontaVista)でのプログラム開発を行ってみて違いに戸惑いを感じました。(マルチ)プロセスとは何ぞや?から始まり、さらにそのプロセス内で作成されるスレッド、そのプロセス・スレッドは他のプロセス・スレッドと並列で動く等等。(正確にはあたかも同時に動作しているかのように見えるってことですよね?) 前半の"タスク"と後半の"プロセス"とはこのように別物なのですよね? 今までの経験では並列動作という概念が無かったもので、どうもしっくりこなく意見をあおぐ為投稿させていただきました。 かなり漠然としたことで恐縮なのですが、今まで述べたことでなにか勘違いしているんじゃないかとか間違えていることとかありますか? 長文となり申し訳ありません。

  • 子プロセスのデバッグ方法について

    VisualStudio2008のVCでデバッグをしています。 Win32のCreateProcess関数で"自分自身"のEXEファイルを実行すると、新プロセスが起動するのですがデバッグができません。 CreateProcessの呼び出し側プロセスと、同じプログラムである新プロセスを同時にデバッグすることはできないものでしょうか。

  • プロセスとスレッドの違いについて(Cプログラミングの観点から)

    プロセスとスレッドの違いがしっくりきません。 <プロセス> (1)プログラムの実行単位。Windows や Linux などの汎用 OS 上のアプリケーションは一般にプロセスとして動作している。プロセスは1つ以上のスレッドと、ファイル、ヒープメモリなどのリソースで構成される (2)起動や切り替えのオーバーヘッドが大きい <スレッド> (1)同一プロセス内の複数スレッドを同一メモリ空間上で実行でき、メモリ消費量などが軽減できる。 (2)マルチスレッド処理のプログラミングにおいては、同じデータを複数のスレッドが同時に書き換えることによる不整合に注意し、排他制御を行う必要がある。 等はwiki等調べて理解しています。 何が疑問なのかと申し上げますと、具体的にプログラミングする際に (1)マルチプロセスとマルチスレッド方式では、ソースにどのような違いが出てくるか (2)マルチプロセスとマルチスレッド方式では実行時間がどれだけ変化するか がわからないのです。お仕事で並列処理等について担当されている方などおられましたら、お手数ですがご教授ください。 なお、わかりやすい書籍、webサイト等ありましたらそれも併せて教えていただけると助かります。よろしくお願いします。ちなみに、環境はWindowsXP,VisualC++ExpressEdition2005を使っていますので、UNIXよりはWindowsかつCで動くプログラム例で教えていただけると大変助かります。しかし、当方Javaも多少であれば組めますのでJavaでも構いません。 何卒、よろしくお願い致します。

  • mkdirについて

    あるページにおいて、サブミットを押したらディレクトリを作る、というものを作ってみたのですが、ディレクトリが出来ません。。なぜなのでしょうか??? このページのサブミットを押すと、、 <html><body> <FORM ACTION="/cgi-bin/test.pl" METHOD="POST"> <INPUT TYPE="submit" VALUE="Submit"> </FORM> </body></html> ↓ ↓ このCGIでディレクトリを作るようにしたいのですが。。 #!/usr/bin/perl print "Content-type: text/plain", "?n?n"; $mkdir = "/bin/mkdir"; $dir = "/tmp/testdir"; @test = ($mkdir, $dir); system @test; 家のパソコン(MacOSX)で試していますので、サーバ側の問題ではないと思います。mkdirなどのパスも確認したのであっていると思います。分かる方、お願いします。

    • ベストアンサー
    • CGI
  • process has not exited

    実行可能なjarファイルをコマンド実行しその戻り値を取得したくて下記プログラムを書きました。 ところがprocess.exitValue() のところで  process has not exited というエラーを起こしてしまいます。原因はお分かりになりますでしょうか。 String command = "java -jar test.jar test; Process process = Runtime.getRuntime().exec(command); System.out.println("▼▼▼実行中のコマンド=" + command); //int no = process.waitFor(); //exec()が非同期実行であるため実行結果が返ってくるまで待つ System.out.println("▼▼▼コマンドの実行完了"); BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); String line = null; while ( (line = in.readLine())!=null ) { line = in.readLine(); System.out.println(line); } System.out.println("★★★コマンドの戻り値=" + process.exitValue()); if(process.exitValue() != 0) { process.destroy(); } in.close(); } } catch(Exception e) { if( process != null ) { process.destroy(); } e.printStackTrace(); }

    • ベストアンサー
    • Java
  • オペレーティングシステムという分野のプロセスの問題です

    オペレーティングシステムという分野のプロセスの問題です プロセス(スレッド)は、「実行可能状態」「実行状態」「待ち状態」の 3つの遷移するが、「待ち状態」を設けることの利点と欠点を述べよ、 という問題があります 利点はわかったのですが、欠点がわかりません 「待ち状態」を設けることの欠点とは何ですか?

専門家に質問してみよう