我尝试用c程序执行带有一些参数的程序。但它似乎不起作用。 这是c:
中的代码#include<stdio.h>
#include<unistd.h>
int main(int argc, char *argv[])
{
int i;
for (i = 0; i < 10; i++)
{
execl("tempo2","-gr fake","-f best.sim.par","-ndobs 30","-nobsd 1","-ha 12","-randha y","-start 57023","-end 60000","-rms 0.0012",NULL);
}
return 0;
}
我在Mint 17上用gcc编译。当我运行那个c程序时没有任何反应。 在bash中,它的工作方式如下:
#!/bin/bash
for i in `seq 1 10`;
do
tempo2 -gr fake -f best.sim.par -ndobs 30 -nobsd 1 -ha 12 -randha y -start 57023 -end 60000 -rms 0.0012
done
任何人都可以将bash代码翻译成c或告诉我做错了吗? 谢谢和快乐的hollydays
答案 0 :(得分:2)
您可以使用system()函数代替execl()来执行shell命令
system("tempo2 -gr fake -f best.sim.par -ndobs 30 -nobsd 1 -ha 12 -randha y -start 57023 -end 60000 -rms 0.0012");
答案 1 :(得分:1)
检查返回码。根据手册页,
返回值为-1,并设置errno以指示错误。
我没有你的程序,但你需要指定“tempo2”的完整路径,否则你将获得errno 2 =&gt;没有这样的文件或目录。
答案 2 :(得分:1)
execl
的第一个参数是程序运行的路径。第二个参数是该程序的argv[0]
中出现的值,并且通常是相同的。因此,您应该在参数列表中添加"tempo2"
两次。此外,命令行上每个以空格分隔的单词应该位于单独的字符串中。因此,您应该使用"-gr fake"
而不是"-gr","fake"
。
总而言之,您的execl
电话应如下所示:
execl("tempo2","tempo2","-gr","fake","-f","best.sim.par","-ndobs","30","-nobsd","1","-ha","12","-randha","y","-start","57023","-end","60000","-rms","0.0012",NULL);
最后,关于execl
的一件重要事情。 用新程序替换当前进程。因此,即使它处于循环中,tempo2
也只会运行一次。要执行您要执行的操作,您需要使用fork
创建子进程来运行每个execl
。
总而言之,@SunDro建议您最好使用system
。