1

C ++プログラムを作成したいのですが、popenここで関数を使用して、Unixのコマンドラインにコマンドを送信しています。正常に動作しますが、を呼び出しcd directoryてもディレクトリは変更されません。cd directoryスクリプトディレクトリパスの変更を終了した後、スクリプトで実行しようとした場合も同じです。. ./script.shだから、私はそうではないように実行しなければならないスクリプトですが、関数./sript.shでそれを行う方法はpopen". "の最初の引数の前に追加しようとしましpopenたが、実行". ls"するとエラーが発生します。

コード:

cout << "@ Command from " << session->target().full() << ": " << message.body() << endl;
//cout << "Prisla zprava" << endl;
//m_session->send( "Hello World", "No Subject" );
//system( message.body().c_str() );
//if ( message.body() == "" )
FILE* outp;
char buffer[100];
string outps = "";
outp = popen( message.body().c_str(), "r" );
while ( !feof(outp) )
{
    fgets( buffer, 100, outp );
    outps = outps + buffer;
}
pclose(outp);
cout << "& Output from command: " << outps << endl;
m_session->send( outps.c_str(), "Output" );

実行したいのはInmessage.body();です(これはから受け取っています)。たとえばの場合、実際のディレクトリ内のファイルのリストとともに返されます。しかし、メッセージがの場合、スクリプトのディレクトリを変更しようとするようなことは何も起こりません。stringXMPPstring"ls"string"cd directory"

4

2 に答える 2

5

通常、popen()コマンドがコマンドを実行する方法は、シェルを介したものです。それで、それはパイプを開き、そしてフォークします。子供はいくつかの配管を行い(パイプを標準入力または標準出力に接続します-フラグに応じて)、次に実行します

execl("/bin/sh", "/bin/sh", "-c", "what you said", (char *)0);

したがって、すべてがどのように動作するかは、主要な環境変数、特にPATHに依存します。

現在のディレクトリでスクリプトを実行する場合は、次のいずれかのオプションがあります。

outp = popen("./script.sh", "r");
outp = popen("sh -x ./script.sh", "r");
outp = popen("sh -c './script.sh arg1 arg2'", "r");

ls' 'コマンドを実行する場合:

outp = popen("/bin/ls /the/directory", "r");

そして、何かを実行する前にディレクトリを変更したい場合:

outp = popen("cd /somewhere/else; ./script", "r");

等々...

popen()を使用しているプログラムのディレクトリを変更する場合は、「chdir()」システムコール(または場合によってはfchdir())を使用する必要があります。始めたところに戻りたいと思う場合は、次を使用してください。

int fd = open(".", O_RDONLY);
chdir("/some/where/else");
...do stuff in new directory
fchdir(fd);

(明らかに、そのロットでエラーチェックが必要です。)

于 2009-10-30T05:04:19.470 に答える
0

理解できないコードが少しあるようです。あなたは、パイプから読んでいます。入力パイプにoutp名前を付けるのはかなり混乱します。次に、読んだ文字列を取得してに渡します。outpm_session->send()

このプロセス全体のどこにも、Unixコマンドラインを操作していません。特に、そうでpopen()はありません。

于 2009-10-28T14:51:06.740 に答える