c 执行不起作用
c execute doesn't work
我尝试通过 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 或告诉我哪里做错了吗?
谢谢,祝你节日快乐
您可以使用 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");
检查 return 代码。根据手册页,
The return value is -1, and errno is set to indicate the error.
我没有你的程序,但你需要指定 "tempo2" 的完整路径,否则你将得到错误号 2 => 没有这样的文件或目录。
execl
的第一个参数是 运行 的程序路径。第二个参数是出现在该程序的 argv[0]
中的值,并且通常是相同的。因此,您应该将 "tempo2"
两次 放入您的参数列表中。此外,命令行上每个 space 分隔的单词都应该在一个单独的字符串中。因此,您应该使用 "-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
。
我尝试通过 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 或告诉我哪里做错了吗? 谢谢,祝你节日快乐
您可以使用 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");
检查 return 代码。根据手册页,
The return value is -1, and errno is set to indicate the error.
我没有你的程序,但你需要指定 "tempo2" 的完整路径,否则你将得到错误号 2 => 没有这样的文件或目录。
execl
的第一个参数是 运行 的程序路径。第二个参数是出现在该程序的 argv[0]
中的值,并且通常是相同的。因此,您应该将 "tempo2"
两次 放入您的参数列表中。此外,命令行上每个 space 分隔的单词都应该在一个单独的字符串中。因此,您应该使用 "-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
。