我正在从“c”程序调用 shell 脚本,并在 c 中有一些变量,我想将它们作为参数传递给 shell 脚本。我尝试使用 system() 调用 shell 脚本,但我作为参数传递的变量被视为字符串而不是变量。
问问题
5305 次
4 回答
1
外壳脚本(a.sh):
# iterates over argument list and prints
for (( i=1;$i<=$#;i=$i+1 ))
do
echo ${!i}
done
C代码:
#include <stdio.h>
int main() {
char arr[] = {'a', 'b', 'c', 'd', 'e'};
char cmd[1024] = {0}; // change this for more length
char *base = "bash a.sh "; // note trailine ' ' (space)
sprintf(cmd, "%s", base);
int i;
for (i=0;i<sizeof(arr)/sizeof(arr[0]);i++) {
sprintf(cmd, "%s%c ", cmd, arr[i]);
}
system(cmd);
}
于 2013-08-12T04:08:05.033 回答
0
您必须构造一个包含完整命令行的字符串system
才能执行。最简单的可能是使用sprintf
.
char buf[100];
sprintf(buf, "progname %d %s", intarg, strarg);
system(buf);
这是初学者的快速方法。
但是还有fork
and的强大功能exec
(至少对于 unix 系统而言)。如果您的参数已经是单独的字符串,这可能比真正复杂的格式规范更容易;更不用说为复杂的格式规范计算正确的缓冲区大小了!
if (fork() == 0) {
execl(progname, strarg1, strarg2, (char *)NULL);
}
int status;
wait(&status);
if (status != 0) {
printf("error executing program %s. return code: %d\n", progname, status);
}
于 2013-08-12T04:12:00.177 回答
0
下面这个程序对我有用
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char buf[1000]; //change this length according to your arguments length
int i;
for (i=0;i<argc;i++) {
if(i==0)
{
sprintf(buf, "%s", "sh shell-scriptname.sh");
sprintf(&buf[strlen(buf)]," ");
}
else
{
sprintf(&buf[strlen(buf)],argv[i]);
sprintf(&buf[strlen(buf)]," ");
}
}
//printf("command is %s",buf);
system(buf);
}
我的 Shell 脚本有如下参数
sh shell-scriptname.sh -ax -by -cz -d blah/blah/blah
我使用以下代码编译了 C 程序
gcc c-programname.c -o 实用程序名称
执行
./utility-name -ax -by -cz -d blah/blah/blah
为我工作
于 2017-11-02T21:58:32.027 回答
-1
这不会打印子进程的返回状态。
返回状态是一个 16 位字。对于正常终止:字节 0 的值为零,返回码在字节 1 中 对于由于未捕获信号而终止:字节 0 具有信号编号,字节 1 为零。
要打印退货状态,您需要执行以下操作:
while ((child_pid =wait(&save_status )) != -1 ) {
status = save_status >> 8;
printf("Child pid: %d with status %d\n",child_pid,status);
于 2014-10-13T03:07:15.327 回答