No.8ベストアンサー
- 回答日時:
> プログラムで上記のようにして実行しても、親プロセスが死んじゃうと、一緒に死んじゃうみたいです。
変だなあ。試してみたんだけど、大丈夫なんだよなあ。試したソースと
スクリプトを。
親のソース。
#include <stdlib.h>
int main()
{
system("nohup a.sh &");
return 0;
}
呼ばれるスクリプト。
#!/usr/bin/sh
sleep 5
echo "aaa" >> aaa.txt
で、chmod u+x a.sh して、a.sh に実行権限をつけて、
$ a
ってして、5秒のうちに急いでログアウトする。子プロセスの a.sh は
中断されず aaa.txt に出力されている。
system() に渡すコマンドラインから nohup を外すと、子プロセスが
中断されることも確認。
また、ログインシェルを csh にしたら nohup をつけなくても、
子プロセスが中断されないことも確認。
# 意地になってます (^^;
この回答への補足
ためしに、スクリプトを上記のやつで実行してみたら、ちゃんと動いてるみたいです。
シェルの中身が悪いんですかね。
よくわかりませんが、とりあえず、プログラムのほうは大丈夫みたいです。
ありがとうございました。
No.6
- 回答日時:
> systemを使った場合、もし、シェルスクリプト(子)が起動中に親プログラムが
> 終了してしまったら、シェルのほうは一緒に死んでしまうのでしょうか
これは unix でのプロセスの扱い方の話なので、呼び方には関係ないです。
代表的なところでいうと、sh は端末が切り離されたときに HUP シグナルが
発生します。そのスクリプトが sh で動くものであれば、親プロセスが
端末から切り離されてないと、親が終了したときには、その子供に SIGHUP が
通知されます。何も考えずに作っていれば子プロセスも終了します。
それを回避するには nohup コマンドを使います。
csh は HUP を含めたキーボードから発生するシグナルはバックグラウンドジョブ
には通知されません。なので、親プロセスが終了しても、子プロセスは
動きつづけます。
この回答への補足
回答ありがとうございます。
nohupコマンドっていうのがあるのですね。
ちょっとプログラムに組み込んでみたのですが、コンパイルエラーが出ます。
"「nohup」にはプロトタイプが必要です"というエラーです。
あと確認したいのですが、このコマンドは引数はひとつしか渡せない??
この認識はあってますか?
No.5
- 回答日時:
> 親プログラムとシェルスクリプトは同時に動作させたいと思ってます
ということは、シェルスクリプトに起動をかけたら、その終了を待たずに
プログラムは他の処理を続けて良い、ということですね。であれば、
system("スクリプト &");
と、バックグラウンドジョブで起動すればOK。
> fork()+exec()の使い方がわからないのですが
fork() は以下のように使います。
pid_t pid;
pid = fork();
if (pid == 0) {
execl("スクリプト", NULL);
} else if (pid < 0) {
/* fork() に失敗! */
}
exec系の関数はいろいろありますので、man を参照してください。
例えば、私が最初に挙げたような ls -la をしたければ、execl() なら
execl("/usr/bin/ls", "-la", NULL);
と使います。execv() なら
char *argv[3] = {"/usr/bin/ls", "-la", NULL};
execv("/usr/bin/ls", argv);
と使います。
execle() と execve() は、更に環境変数の指定が出来ます。
execlp() と execvp() は、最初の引数に "/" が入っていなければ、
環境変数 PATH を利用した検索も行ないます。例えば、
execlp("ls", "-la", NULL);
という感じ。
この回答への補足
systemを使った場合、もし、シェルスクリプト(子)が起動中に親プログラムが終了してしまったら、シェルのほうは一緒に死んでしまうのでしょうか。
できれば、子は親に関係なく起動していてほしいのですが。
その場合はfork()+exec()のほうで起動すればなんとかなるものなのでしょうか。
No.4
- 回答日時:
ちょっと確認します。
1.シェルスクリプトはエラーを起こす可能性があるか?
2.シェルスクリプトはエラーの場合それを報告するか?
3.エラーの報告はstderrか?プロセスステータスか?
4.起動するプログラム(親)はシェルスクリプト(子)の終了を待つか?同時に動作するか?
仕様によってはsystem()では役立たずの場合もあります。
完全な制御が必要ならfork()+exec()でしょう。
場合によってはwait()を使ったりsignal()の制御も必要になります。
この回答への補足
1~3についてはエラーを起こす可能性はありません。
4については、親プログラムとシェルスクリプトは同時に動作させたいと思ってます。
fork()+exec()の使い方がわからないのですが、
具体的にどういうふうに使うのでしょうか?
No.3
- 回答日時:
補足読みました。
シェルスクリプトと言うことでしたらa-kumaさんがご回答された様に、
system("xxx"); ・・・xxxはシェルスクリプト名、必要ならばパス付きで。
または、実行権が付いていなければ
system("sh xxx");
とかでしょうか。
また、こちらもa-kumaさんが書かれていますが、子プロセスとして動作させたり、プロセスをスクリプトに空け渡して実行させるとしたらfork + exec系を使用することになると思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Pythonの作業環境・作業フォルダの迅速な設定・指定方法 3 2022/04/01 07:55
- Excel(エクセル) 別インスタンスのエクセルを制御したい 1 2023/05/10 02:03
- Microsoft ASP C#からvbsを実行したい 5 2022/11/24 17:31
- ドライブ・ストレージ PCのSSDの取り換え データ移動 9 2023/05/20 22:39
- C言語・C++・C# C++アンインストールの影響 5 2022/10/15 08:49
- その他(プログラミング・Web制作) PythonのプログラムのDirに関する質問です 3 2022/12/04 17:01
- 物理学 台と小物体合わせた全体の水平方向の運動方程式 とは? 8 2022/09/02 06:33
- 高校 高校物理についての質問です。 2 2022/07/17 15:33
- Windows 10 パソコンの操作ができません。。。 4 2022/06/02 18:38
- レディース ロレックスのレディデイトジャストが欲しいです。 ロレックスへたくさん通っていますが 一回も出会えませ 1 2023/07/08 22:15
このQ&Aを見た人はこんなQ&Aも見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
Cからシェルを起動し返り値をハンドリングする方法
C言語・C++・C#
-
コマンド(例えばls)の出力結果を文字列で取得するプログラムの作成方法
C言語・C++・C#
-
system関数がうまくいかない
C言語・C++・C#
-
-
4
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
5
C++のプログラムをバックグラウンドで実行
C言語・C++・C#
-
6
systemの戻り値を取得する方法
C言語・C++・C#
-
7
VC++から引数付きexeファイルの実行
C言語・C++・C#
-
8
C言語 配列の長さの上限
C言語・C++・C#
-
9
圧縮(Zip)について
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
IISがフリーズ
-
Linuxでのスレッド間メッセージ...
-
VB.NET 自プログラムのプロセス...
-
パソコンに出てくるじゃまな表...
-
他のコンピュータのプロセスを取得
-
共有メモリの同時アクセスにつ...
-
Apacheの子プロセスが再起動す...
-
C#でのbatファイル実行結果取得
-
WMIでのプロセスの起動・終了監...
-
コマンド実行時の結果のリダイ...
-
sleep関数の精度について
-
OSPFでプロセスを分ける意義に...
-
SendMessageが失敗するときがある
-
Windowsでのfork方法
-
特定ユーザーのプロセス情報を...
-
c言語でプロセスIDを調べたい
-
C++でシェルを起動
-
他のアプリケーションをクリッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
タスクマネージャーのプロセス...
-
VB6.0 SHELLで起動...
-
C#でのbatファイル実行結果取得
-
プロセスのアタッチ・デタッチ...
-
プロセスIDからウィンドウハ...
-
プロセスIDの取得方法について
-
popen について
-
C++のプログラムをバックグラウ...
-
非表示になったエクセルは?
-
Windowsでのfork方法
-
別のプロセスの関数を呼び出す...
-
sleep関数の精度について
-
Visual C++からpingを実行して...
-
ADOでアクセスのレコードに...
-
C++でシェルを起動
-
SendMessageが失敗するときがある
-
ウィンドウのタイトルからプロ...
-
OSPFでプロセスを分ける意義に...
おすすめ情報