Как я могу писать команды в оболочку vxworks с помощью программы c

Если бы я хотел запустить команду оболочки в Linux с помощью программы на языке C, я бы использовал

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);  
}  

person Jason    schedule 14.10.2010    source источник


Ответы (4)


Я обнаружил, что сегмент кода ниже работает для меня. По какой-то причине изменение 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);
}
person Jason    schedule 18.10.2010

Если это целевая/ядерная оболочка (т. е. работающая на самой цели), то помните, что все команды оболочки просто транслируются в вызовы функций.

Таким образом, "ls" на самом деле является вызовом ls(), который, как мне кажется, объявлен в dirLib.h.

person Benoit    schedule 14.10.2010
comment
Это верно. Я могу придумать несколько причин для ввода командной строки в оболочку, если только команда или выражение не были известны во время компиляции (возможно, пользователь ввел for из файла сценария). Однако оболочка способна выполнять оценку выражения C во время выполнения, что может быть полезно (возможно, нечасто). - person Clifford; 15.10.2010

Я думаю, что функция ExecCmd — это то, что вам нужно.

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

person nategoose    schedule 14.10.2010

Как всегда, прочтите документацию. ioLib.h требуется для большинства функций, используемых в этом примере, и stdio.h, конечно же, для printf().

Что касается общего вопроса о том, нужно ли вам включать какие-либо конкретные заголовки для любого кода для компиляции, вам нужно объявить все используемые символы, и обычно это означает включение соответствующих заголовков. Компилятор вскоре сообщит вам о любых неопределённых символах либо предупреждением, либо ошибкой (в C89/90 неопределённые функции не являются ошибкой, просто плохой идеей).

person Clifford    schedule 14.10.2010
comment
Спасибо за ответ. Я полный новичок в vxworks, возможно, поэтому у меня возникли проблемы с поиском API. (Знаю, звучит нелепо) В любом случае, спасибо за ссылку, она должна очень помочь. - person Jason; 15.10.2010
comment
@Jason: Я случайно нашел эту копию документации VxWorks от Google. Вместо того, чтобы полагаться на какую-либо копию, возможно, старой документации, размещенную в университете, вам следует использовать документацию, поставляемую с вашими инструментами разработки VxWorks и лицензией. Вы также можете получить доступ к официальной документации в Интернете по адресу windriver.com/support. - person Clifford; 16.10.2010