簡體   English   中英

如何從一個C程序中調用兩個C程序?

[英]How to call two C programs from within one C program?

如何從另一個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]# 

有人可以解釋我做錯了什么嗎?

一個非常簡單的解決方案是使用system()函數。 將程序的命令行傳遞給它以運行該程序。

根據您的最新代碼,這是您的問題:

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]);

可能最簡單的技術是將兩個調用(兩個“不同的”程序確實都稱為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...

顯然,您通常會根據傳遞給程序的參數來構建這些命令行,而不是如圖所示進行硬接線。 在構建命令行時,請注意緩沖區溢出和意外字符。

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]);

但是如果cmd1cmd2沒有足夠的空間,則上述操作將很糟糕。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM