1

別の C アプリケーション内から 2 つの C アプリケーションを呼び出すにはどうすればよいですか?

例:

pg1.c can be run as ./a.out pg1_args

pg2.c can be run as ./a.out pg2_args

次のように実行できるプログラムを書きたいと思います。

./a.out pg1_args pg2_args

結果は次のようになります。

./a.out pg1_args

./a.out pg2_args

./a.out pg1_args

./a.out pg2_args

ここの pg1 は svm_scale で、ここの pg2 は svm_predict で、どちらも libsvm から取得しました: http://www.csie.ntu.edu.tw/~cjlin/libsvm/

[ 編集 ]

@ジョナサン、

私はこの概念を試すためにこれらのプログラムを書きました..

pg1.c

#include <stdio.h>
#include <string.h>

int main(int argc,char **argv)
{
    FILE *fin;
    fin=fopen("pg1file.txt","a");
    fprintf(fin,"%s",argv[1]);
    fflush(fin);
    fclose(fin);
}

pg2.c

#include <stdio.h>
#include <string.h>

int main(int argc,char **argv)
{
    FILE *fin;
    fin=fopen("pg2file.txt","a");
    fprintf(fin,"%s",argv[1]);
    fflush(fin);
    fclose(fin);
}

pg3.c:

#include<stdio.h>
#include<string.h>
int main(int argc,char **argv)
{
int i;
const char *cmd1 = strcat("./pg1 ",argv[1]);
const char *cmd2 = strcat("./pg2 ",argv[2]);
for(i=0;i<4;i++)
{
if (system(cmd1) != 0)
    printf("\n error executing pg 1"); 
if (system(cmd2) != 0)
    printf("\n error executing pg 2");
}
}

[root@localhost trinity]# ./a.out first second
Segmentation fault (core dumped)
[root@localhost trinity]# 

誰かが私が間違ったことを説明できますか?

4

4 に答える 4

4

あなたの最新のコードから、ここにあなたの問題があります:

const char *cmd1 = strcat("./pg1 ",argv[1]);
const char *cmd2 = strcat("./pg2 ",argv[2]);

これにはいくつかの理由があります (通常、文字列リテラルは読み取り専用メモリに置かれ、最後に新しいデータを連結するためのメモリが割り当てられません)。

それを次のように変更します。

size_t len = snprintf(NULL, 0, "./pg1 %s", argv[1]);
char *cmd1 = malloc(len + 1);
snprintf(cmd1, len, "./pg1 %s", argv[1]);

size_t len = snprintf(NULL, 0, "./pg2 %s", argv[2]);
char *cmd2 = malloc(len + 1);
snprintf(cmd2, len, "./pg2 %s", argv[2]);
于 2010-01-22T06:46:54.930 に答える
4

非常に簡単な解決策は、system() 関数を使用することです。プログラムのコマンドラインをそれに渡して、プログラムを実行します。

于 2010-01-22T06:15:29.683 に答える
1

おそらく最も簡単な方法は、2 つの呼び出し (2 つの「異なる」プログラムは、実際には両方とも a.out と呼ばれているのでしょうか?) を文字列として作成し、system()関数を使用することです。

const char *cmd1 = "./a.out pg1_args";
const char *cmd2 = "./a.out pg2_args";

if (system(cmd1) != 0)
    ...report trouble...
if (system(cmd2) != 0)
    ...report trouble...

明らかに、通常、これらのコマンド ラインは、示されているように配線するのではなく、プログラムに渡された引数から作成します。コマンド ラインを作成するときは、バッファ オーバーフローと予期しない文字に注意してください。

于 2010-01-22T06:15:50.053 に答える
1
const char *cmd1 = strcat("./pg1 ",argv[1]);
const char *cmd2 = strcat("./pg2 ",argv[2]);

間違っている。 "./pg1 "読み取り専用の文字列です。それに何も追加することはできません。とにかく、文字列が終了した後はメモリにアクセスできませ"./pg1 "ん。そのため、文字列を書き込むことができるメモリにアクセスする必要があります。

試す:

char *cmd1 = malloc(strlen("./pg1 ") + strlen(argv[1]) + 1);
char *cmd2 = malloc(strlen("./pg2 ") + strlen(argv[2]) + 1);

if (cmd1 == NULL || cmd2 == NULL) { /* deal with error */ }
sprintf(cmd1, "./pg1 %s", argv[1]);
sprintf(cmd1, "./pg1 %s", argv[1]);

完了したら、メモリを解放することを忘れないでください。または、十分な大きさの配列として宣言することもできます:

char cmd1[32] = "./pg1 ";
char cmd1[32] = "./pg2 ";
strcat(cmd1, argv[1]);
strcat(cmd1, argv[2]);

cmd1しかし、またはに十分なスペースがない場合、上記は悪くなりますcmd2

于 2010-01-22T06:50:24.753 に答える