1

如何从另一个 C 应用程序中调用两个 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

一个非常简单的解决方案是使用 system() 函数。将程序的命令行传递给它以运行程序。

于 2010-01-22T06:15:29.683 回答
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 回答
1

可能最简单的技术是将两个调用(两个“不同”的程序真的都称为 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但如果or中没有足够的空间,上述情况会很糟糕cmd2

于 2010-01-22T06:50:24.753 回答