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

Если бы я хотел запустить команду оболочки в 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);  
}  

Ответы [ 4 ]

2 голосов
/ 19 октября 2010

Я обнаружил, что сегмент кода ниже работает для меня. По какой-то причине изменение globalStdOut не сработало. Также у меня не работала функция execute. Но, поставив в файл определенную задачу, я смог получить необходимые данные.

/* 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 голосов
/ 15 октября 2010

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

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

0 голосов
/ 15 октября 2010

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

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

0 голосов
/ 15 октября 2010

Я думаю, что функция ExecCmd - это то, что вы ищете.

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

...