如果我想在linux下使用c程序运行shell命令,我会使用
system("ls");
有没有办法可以在Wind River vxworks中实现这一目标?
我找到了以下示例,但我想知道我是否需要包含vxworks头文件才能使用?我假设我这样做,但我怎么弄清楚哪一个?
// This function runs a shell command and captures the output to the
// specified file
//
extern int consoleFd;
typedef unsigned int (*UINTFUNCPTR) ();
extern "C" int shellToFile(char * shellCmd, char * outputFile)
{
int rtn;
int STDFd;
int outFileFd;
outFileFd = creat( outputFile, O_RDWR);
printf("creat returned %x as a file desc\n",outFileFd);
if (outFileFd != -1)
{
STDFd=ioGlobalStdGet(STD_OUT);
ioGlobalStdSet(STD_OUT,outFileFd);
rtn=execute(shellCmd);
if (rtn !=0)
printf("execute returned %d \n",outFileFd);
ioGlobalStdSet(STD_OUT,STDFd);
}
close(outFileFd);
return (rtn);
}
答案 0 :(得分:2)
如果这是一个目标/内核shell(即在目标本身上运行),那么请记住所有shell命令都只是转换为函数调用。
因此“ls”实际上是对ls()的调用,我相信它是在dirLib.h中声明的
答案 1 :(得分:2)
我发现下面的代码段对我有效。由于某种原因,更改globalStdOut不起作用。执行功能对我来说也不起作用。但是我将特定任务设置到我的文件中,我能够获得所需的数据。
/* This function directs the output from the devs command into a new file*/
int devsToFile(const char * outputFile)
{
int stdTaskFd;
int outputFileFd;
outputFileFd = creat( outputFile, O_RDWR);
if (outputFileFd != ERROR)
{
stdTaskFd = ioTaskStdGet(0,1);
ioTaskStdSet(0,1,outputFileFd);
devs();
ioTaskStdSet(0,1,stdTaskFd);
close(outputFileFd);
return (OK);
}
else
return (ERROR);
}
答案 2 :(得分:0)
我认为ExecCmd
功能正是您所需要的。
答案 3 :(得分:0)
与以往一样,请阅读documentation。对于该示例中使用的大多数函数都需要ioLib.h,而对于printf()当然是stdio.h。
关于是否需要为任何编译包含任何特定标头的一般问题,您需要声明所有使用的符号,通常这意味着包括适当的标头。编译器很快会通过警告或错误告诉你任何未定义的符号(在C89 / 90中未定义的函数不是错误,只是一个坏主意)。