
popen() を使いこなせるようになろうとしているのですが、少し難しくてつまづいています。この関数は基本的に、指定したスクリプトをバックグラウンドで実行させるためのもの、と考えてよろしいでしょうか?
マニュアルを読んでわからなかった言葉があります。「パイプ」「片方向ストリーム」 なのですが、検索して、パイプはなんとなく出入力先のポートだということが書いてあったのですが、いまいちピンときません。パイプを経由することで生まれるメリットのようなものはあるのでしょうか?
次に、ファイルポインタなのですが、スクリプトを実行させるのになぜこれが必要になるのでしょうか?おそらくほとんどのスクリプトがファイルの先頭にポインタを置く必要があると思うのですが、例えば'a'などとして、最後に置くとスクリプトが実行されなくなったりしませんでしょうか?
現在の理解度では
popen("php -f $script", "r");
exec("php -f $script > /dev/null &");
の違いがわかりません。どちらも$sriptをバックグラウンドで実行してくれますが、マニュアルに記載されているファイルポインタの指定とパイプのオープンがもたらす決定的な違いなどどのようなものになるのでしょうか?
また、popen()使用後に、pclose() で閉じないでいるとどのようなことが起こるのでしょうか?
たくさんありますが、ひとつでもお分かりになるかたおられましたらどうぞよろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
この辺はUNIXでのCプログラミングの経験がないと
わかりづらいかもしれませんね。
> popen("php -f $script", "r");
> exec("php -f $script > /dev/null &");
>
> の違いがわかりません。
popen の嬉しいところは起動したプロセスの標準入力に
データを送ったり、逆にプロセスの標準出力からデータを
受け取ることができるところにあるので、この例ではpopenを使う意味がないです。
ファイルポインタはデータのやり取りの際に使います。それとpopenの指定で
"a"は使えなかったはずです。
たとえばあるディレクトリにあるファイル名を得たいとして、
$ifp = popen("/bin/ls", "r")
while (!feof($handle)) {
$item = fgets($ifp)
echo '<li>' . $item . '</li>'
}
ということができます。
execでは直接にはできませんよね?
> popen()使用後に、pclose() で閉じないでいるとどのようなことが起こるのでしょうか?
pclose() で最期を見取ってやらないと起動したプロセスが
終われません。
>execでは直接にはできませんよね?
直接的というのはどういうことなのでしょうか?
<?php
exec('ls', $output);
foreach($output as $line) {
echo '<li>' . $line . '</li>';
}
?>
教えていただいたコードがそのままでは動きませんでしたので修正いたしました。
<?
$ifp = popen("/bin/ls", "r");
while(!feof($ifp)){
$item = fgets($ifp);
echo '<li>' . $item . '</li>';
}
?>
この場合、pclose をしていないのですが、プロセスがそのまま残っているということでしょうか?では exec() ではそのような心配はしなくてよいのでしょうか?ほったらかしにしてしまったプロセスを終了させる方法などありますでしょうか?
No.2
- 回答日時:
すみません。
他の言語とごっちゃになってました。execも第二引数を使えば起動したプロセスの出力を取れますね。
ただ、popenの場合一行分もしくは指定バイト数読み取れば
いったん戻ってきますが、execの場合は起動したプロセスが終了するまで
制御が戻ってこないと思われます。
pcloseで始末しなかったときの起動プロセスの後始末ですが、
プロセスIDがわかればシグナル送って強制終了とかできると思いますが
(PHPの組み込み関数でその手のものがあるかどうかは知りません)、
ゾンビプロセスとなってとどまり続けてしまうのではないでしょうか?
PHPのマニュアルを再確認してみましたが、外部プログラムを起動する関数が
exec
passthru
popen
proc_open
shell_exec
system
とたくさんありそれぞれ微妙に違うのでややこしいこと極まりないですね。
結局popen() とexec() の違いがわからずじまいになってしまったのですが、それはそれでいつか理解できる時まで保留させようと思います。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
- UNIX・Linux redmineにメールを飛ばす方法 1 2022/09/13 22:02
- その他(プログラミング・Web制作) bashのgrepで複数の検索、かつスクリプト内で改行する方法を教えてください。 1 2022/10/06 20:09
- DIY・エクステリア 暗渠パイプの設置について 2 2022/06/20 08:59
- 洗濯機・乾燥機 洗濯機 真下排水について 2 2023/05/20 22:08
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/08 11:02
- Visual Basic(VBA) エクセルVBA コードが同じでもファイルによって処理速度が大きく変わるのはなぜ 5 2022/11/06 21:34
- DIY・エクステリア 塩ビパイプ接続方法 4 2023/05/21 05:39
- その他(開発・運用・管理) 【至急】.htaccessによるディレクトリ単位でのリダイレクト 2 2023/08/10 13:46
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
SendMessageが失敗するときがある
-
VB6.0 SHELLで起動...
-
プロセスのアタッチ・デタッチ...
-
Windowsでのfork方法
-
他のEXEが起動しているかの確認
-
sleep関数の精度について
-
プロセスIDからウィンドウハ...
-
外部プロセスを終了したい!!
-
プロセスIDの取得方法について
-
非表示になったエクセルは?
-
他のコンピュータのプロセスを取得
-
タスクマネージャーのプロセス...
-
VC++6.0 「プロセスへ...
-
デッドロックでダウンします。...
-
VB.NET 自プログラムのプロセス...
-
起動中のプロセスのメモリを書...
-
プロセスが実行中かどうか調べ...
-
API関数 GetExitCodeProcess
-
exeファイルを終了させない。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
VB6.0 SHELLで起動...
-
プロセスIDの取得方法について
-
C#でのbatファイル実行結果取得
-
タスクマネージャーのプロセス...
-
プロセスのアタッチ・デタッチ...
-
vb.netでEXCEL起動がうまくでき...
-
SendMessageが失敗するときがある
-
ADOでアクセスのレコードに...
-
非表示になったエクセルは?
-
explorer.exeが異様にメモリを食う
-
怪しいプロセス教えてください。
-
Process.Startの戻り値を後で取得
-
プロセスIDからウィンドウハ...
-
Linuxでのスレッド間メッセージ...
-
警告『 別のプロセスで使用され...
-
Visual C++からpingを実行して...
-
WSH.Runで待機できません
-
c言語でプロセスIDを調べたい
-
API関数 GetExitCodeProcess
おすすめ情報