UNIX C++でシェルを起動する方法を教えてください。
よくわかっていないので、質問の仕方もあいまいですが、お願いします。

このQ&Aに関連する最新のQ&A

A 回答 (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 をつけなくても、
子プロセスが中断されないことも確認。

# 意地になってます (^^;

この回答への補足

ためしに、スクリプトを上記のやつで実行してみたら、ちゃんと動いてるみたいです。
シェルの中身が悪いんですかね。
よくわかりませんが、とりあえず、プログラムのほうは大丈夫みたいです。
ありがとうございました。

補足日時:2001/07/06 21:11
    • good
    • 0

> コンパイルエラーが出ます



nohup って、コマンドであって、関数ではないです。

  system("nohup スクリプト &");

です。スクリプトには、実行権限をつけておいてください。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
コマンドラインでコマンドを実行するときはいいみたいなのですが、
プログラムで上記のようにして実行しても、親プロセスが死んじゃうと、一緒に死んじゃうみたいです。
他の方法を試してみたいと思います。

お礼日時:2001/07/06 20:11

> systemを使った場合、もし、シェルスクリプト(子)が起動中に親プログラムが


> 終了してしまったら、シェルのほうは一緒に死んでしまうのでしょうか

これは unix でのプロセスの扱い方の話なので、呼び方には関係ないです。

代表的なところでいうと、sh は端末が切り離されたときに HUP シグナルが
発生します。そのスクリプトが sh で動くものであれば、親プロセスが
端末から切り離されてないと、親が終了したときには、その子供に SIGHUP が
通知されます。何も考えずに作っていれば子プロセスも終了します。

それを回避するには nohup コマンドを使います。

csh は HUP を含めたキーボードから発生するシグナルはバックグラウンドジョブ
には通知されません。なので、親プロセスが終了しても、子プロセスは
動きつづけます。

この回答への補足

回答ありがとうございます。
nohupコマンドっていうのがあるのですね。

ちょっとプログラムに組み込んでみたのですが、コンパイルエラーが出ます。
"「nohup」にはプロトタイプが必要です"というエラーです。
あと確認したいのですが、このコマンドは引数はひとつしか渡せない??
この認識はあってますか?

補足日時:2001/07/06 19:15
    • good
    • 0

> 親プログラムとシェルスクリプトは同時に動作させたいと思ってます



ということは、シェルスクリプトに起動をかけたら、その終了を待たずに
プログラムは他の処理を続けて良い、ということですね。であれば、

  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()のほうで起動すればなんとかなるものなのでしょうか。

補足日時:2001/07/06 16:56
    • good
    • 0

ちょっと確認します。



1.シェルスクリプトはエラーを起こす可能性があるか?
2.シェルスクリプトはエラーの場合それを報告するか?
3.エラーの報告はstderrか?プロセスステータスか?
4.起動するプログラム(親)はシェルスクリプト(子)の終了を待つか?同時に動作するか?

仕様によってはsystem()では役立たずの場合もあります。

完全な制御が必要ならfork()+exec()でしょう。
場合によってはwait()を使ったりsignal()の制御も必要になります。

この回答への補足

1~3についてはエラーを起こす可能性はありません。
4については、親プログラムとシェルスクリプトは同時に動作させたいと思ってます。

fork()+exec()の使い方がわからないのですが、
具体的にどういうふうに使うのでしょうか?

補足日時:2001/07/06 13:28
    • good
    • 0

補足読みました。


シェルスクリプトと言うことでしたらa-kumaさんがご回答された様に、

system("xxx"); ・・・xxxはシェルスクリプト名、必要ならばパス付きで。

または、実行権が付いていなければ

system("sh xxx");

とかでしょうか。
また、こちらもa-kumaさんが書かれていますが、子プロセスとして動作させたり、プロセスをスクリプトに空け渡して実行させるとしたらfork + exec系を使用することになると思います。
    • good
    • 0
この回答へのお礼

なんだか、難しそうですね。
ちょっと挑戦してみます。

お礼日時:2001/07/06 16:55

確かに少々あいまいですので補足をお願いいたします。


ここで言うシェルとは仮想端末としてのシェルですか?
それともシェルスクリプトですか?
(後者ではないかと予想はしていますが)
それによって回答は変わってくると思いますので。

この回答への補足

シェルスクリプトのほうです。

補足日時:2001/07/06 11:52
    • good
    • 0

何も考えなくて良いのが system() かな。



#include <stdlib.h>

system("ls -la");

って感じ。

他には、fork()+exec系の関数 とか popen() を使う方法もあります。
system() に比べて、細かくコントロールできるとか、出来ることが
増えていると考えてください。

オンラインマニュアルにも載ってますよ。
    • good
    • 0
この回答へのお礼

早速回答ありがとうございます。
ちょっと調べてみたいと思います。

お礼日時:2001/07/06 11:51

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC++を始めたばかりでVC++2008の扱い方がよくわかりません。

C++を始めたばかりでVC++2008の扱い方がよくわかりません。
はじめまして。今までC言語をひたすらやってきたものですが、
そろそろ就職のためにC++を始めようと考えています。
そして、VC++2008EXPRESSをインストールすることに成功しました。

みなさんよくこのソフトが使いやすいとおっしゃるのですが、
使い方を具体的に書いてあるサイトや本などご存知でしょうか?
たとえば、ソースファイルフォルダにtextを追加する方法とか、
ソースファイルのオブジェクト志向的な書き方などです。

やはり最初は、コンソールアプリから始めようとしていますが、
VCで始めたほうが効率がよいでしょうか?
どうしてもこの統合開発環境を使いこなしたいと考えております。
可能な範囲で構いませんので、アドバイスいただけたら幸いです。

Aベストアンサー

>ソースファイルフォルダにtextを追加する方法
ファイルをコピーするだけですけど?

>ソースファイルのオブジェクト志向的な書き方
C++の入門書の入門書を買ったほうが良いでしょう。
「ロベールのC++入門」とか「明解C++」など。

>使い方を具体的に書いてあるサイトや本などご存知でしょうか?

マイクロソフトのページ。
http://www.microsoft.com/japan/msdn/vstudio/2008/product/express/learn.aspx
「プログラムを作ろう! Microsoft Visual C++ 2008 Express Edition 入門」
http://ec.nikkeibp.co.jp/item/books/A01500.html

>はじめまして。今までC言語をひたすらやってきたものですが、
何より、今までC言語をやってきて、たったこれだけの事を調べられない質問者さんに危機感を感じます。
ここで質問しないと分からないほど時間が無いんでしょうか?それともプログラミングに興味が無いんでしょうか?
就職のために独学したいならやる気を出しましょう。

>ソースファイルフォルダにtextを追加する方法
ファイルをコピーするだけですけど?

>ソースファイルのオブジェクト志向的な書き方
C++の入門書の入門書を買ったほうが良いでしょう。
「ロベールのC++入門」とか「明解C++」など。

>使い方を具体的に書いてあるサイトや本などご存知でしょうか?

マイクロソフトのページ。
http://www.microsoft.com/japan/msdn/vstudio/2008/product/express/learn.aspx
「プログラムを作ろう! Microsoft Visual C++ 2008 Express Edition 入門」
http://ec.nikk...続きを読む

QTurbo C++でのC言語プログラミングの仕方がわからなくて困っています

プログラミング初心者です。

C言語の勉強用にBorlandのTurbo C++ Explorerをインストールしたのですが、ソースのコンパイルや実行の仕方がわからなくて困っています。

ご存じの方いらっしゃいましたら、教えていただけませんか?
よろしくお願いいたします!

Aベストアンサー

Turbo C++ Explorerを起動して、「ホームページ」で「新規作成」ボタンを押し、アプリケーションの種類を選択。
プロジェクトを作ってソースを書いて、メニューから実行(またはF9)
コンパイルなら、メニューから「プロジェクト」→「プロジェクトのコンパイル」を選択。

プロジェクトを作らないで、「Hello.c」のようなコードをそのまま書いた場合は、メニューの「コンパイル」や「実行」が選択できないので。
ソースを保存してコマンドプロンプトを起動して
C:\>bcc32 Hello.c
とやれば「c:\」にexeができる(C:\にソースを保存した場合)。
「bcc32 -h」でヘルプ表示。

一応、昨日から始めたばかりなのでこういうやり方しか知らないので、すみません。

QUNIX CプログラマがC++を学ぶには

僕は今までUNIX上でC言語を使用し開発をしてきました。
しかし、次の仕事からマイクロソフトのVisualStudioのC++で開発するようになったのですが、
全くクラスの考えかたとか、C++の関数がわかりません。

自分のような今までUNIX Cを使用していた人間が、C++を学ぶに最適な
本があったらご紹介ください。

Aベストアンサー

もう十年ほど前になるので、まだあるかどうか不明ですが、私が勉強した本を紹介します。

私もuruchiさんと同じくC言語からC++へステップアップしました。
その時、VC++ Learning Editionを購入しました。
このセットに、マイクロソフトの発行した“C++入門 簡易プログラミングガイド”が含まれていました。

C言語習得者が対象の本で、クラスの考え方や派生・仮想関数等・・・、C言語の立場から非常に分かりやすく書かれていました。
1ページ読むたびに感動し、C++のありがたみが良く分かる非常にすばらしい本でした。
解説とサンプルコードが記述されていますが、特徴としては、なぜC++のこの機能が必要なのか?と言った感じで解説が進んでいきます。
これを読むとC言語の劣るところ、C++の優れているところが具体的に理解できます。
入手困難かもしれませんが、是非候補に入れてください。
ただし、C言語をそれなりにマスターしていないと意味が分からないかもしれません。C言語の中・上級者向きの本でした。

この本は、言語仕様のみの解説です。UNIX→VCならば、その他にMFC等も必要になります。
SDKで十分といわれる方もいらっしゃいますが、MFCを使った方が効率が上がります。

もう十年ほど前になるので、まだあるかどうか不明ですが、私が勉強した本を紹介します。

私もuruchiさんと同じくC言語からC++へステップアップしました。
その時、VC++ Learning Editionを購入しました。
このセットに、マイクロソフトの発行した“C++入門 簡易プログラミングガイド”が含まれていました。

C言語習得者が対象の本で、クラスの考え方や派生・仮想関数等・・・、C言語の立場から非常に分かりやすく書かれていました。
1ページ読むたびに感動し、C++のありがたみが良く分かる非常にすばらし...続きを読む

Q(C#、C++) ではC言語は読めないので

Microsoft Visual Studio(C#、C++) ではC言語は読めないと思います。
MinGwとMSYS今までやっていたのですが、突然作業ができなくなりました。アンインストールして再インストールしてもだめです。
Windows7Ultimate用のC言語のコンパイルソフトとシェルを探しています。
 以上宜しくお願いします。
 
 

Aベストアンサー

いえ、Windowsの「環境変数」から設定するものではありません。
GCCを使うときにMSYSの端末を使っていると思いますが、その端末で gcc ~と入力する代りに
echo $PATH
とやって表示されるものです。あるいは、使い方が違うのなら、それを補足してください。

gccを見つけられないのは、MSYSで動いている「sh」です。
shは独自のPATHを使っています。WindowsのPATHだけでは不十分です。

「突然作業ができなくな」った前後で、設定ファイルを変更したり削除したりしませんでしたか?
.profileとか .bashrc とか

QC言語(UNIX)からVB・VC・C++に移植したことあるかた

C言語(UNIX)からVB・VC・C++に移植した
ことあるかたいませんか?
ある方がいらっしゃいましたら、移行の仕方等教えて下さい。その際注意点等ありましたらお願いします

Aベストアンサー

GUIを持ってるか否かで違います。
またGUIと内部処理が切り離されている場合なら、
GUIを持っていても移植は楽でしょう。

ソースを良く吟味して、

・OSに依存する部分・しない部分
・互換ライブラリのある部分・ない部分
・ライブラリに依存する部分・しない部分

に分けてください。
VCへの移植はOSに依存する部分を入れ替えてしまうことです。
DLLにしておけば、VBからも場合によっては使えるかも知れません。

非常に上手くこの作業を行えば、VC++のフレームワークで
ごく簡単にGUIを追加・移植出来るかもしれません。
無理にGUIにする必要ないならいいんですが。

C++へ移行するのに何か意味があるとお考えでしょうか?
保守の面で意味があるなら、仕様を再度分析した上で、
詳細設計の書き直しが必要です。


人気Q&Aランキング

おすすめ情報