2

如果我想用 ac 程序在 linux 中运行 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);  
}  
4

4 回答 4

3

我发现下面的代码段对我有用。出于某种原因,更改 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);
}
于 2010-10-18T20:11:26.353 回答
2

如果这是一个目标/内核外壳(即在目标本身上运行),那么请记住所有外壳命令都简单地转换为函数调用。

因此“ls”实际上是对 ls() 的调用,我相信它是在 dirLib.h 中声明的

于 2010-10-14T20:48:31.013 回答
0

与以往一样,阅读文档。该示例中使用的大多数函数都需要 ioLib.h,当然 printf() 需要 stdio.h。

至于是否需要为要编译的任何代码包含任何特定标头的一般问题,您确实需要声明所有使用的符号,通常这意味着包括适当的标头。编译器很快就会通过警告或错误告诉您任何未定义的符号(在 C89/90 中,未定义的函数不是错误,只是一个坏主意)。

于 2010-10-14T20:55:06.470 回答
0

我认为该ExecCmd功能是您正在寻找的。

http://www.dholloway.com/vxworks/6.5/man/cat2/ExecCmd.shtml

于 2010-10-14T20:01:37.677 回答