c执行不起作用

时间:2015-04-04 19:56:49

标签: c bash exec

我尝试用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

3 个答案:

答案 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