0

我正在尝试将所有串行数据重定向到 VxWorks 中的一个进程。使用以下代码

fd = open("/tyCo/0", O_RDWR,0);
ioctl(fd, FIOSETOPTIONS, OPT_TERMINAL & ~OPT_7_BIT);
read(fd, line, 100);

给出正确的输入,除了输入的第一个字符没有填充,而是打印到终端。因此,如果我输入“Hello”,则会打印出“H”并且 line="ello"。如果我不输入任何内容并按回车键,我会收到来自 VxWorks Shell 的提示。

我认为 VxWorks Shell 正在截取数据的第一个字母。我的猜测是我必须仅将 STDIO 重定向到新进程,但我发现的所有文档都说使用 ioGlobalStdSet() ,这在 VxWorks 6.4 RTP 中不可用。如何重定向 STDIO 或从我的进程中终止 VxWorks Shell?

4

3 回答 3

1

如果您想将所有任务的输出重定向到当前的登录 shell,我认为答案是:

static int shellResourceReleaseHookAdd_once = 0;

void revert_out()
{
    ioGlobalStdSet( 1, consoleFd ); /* redirect all output to the consoleFd */
    ioGlobalStdSet( 2, consoleFd ); /* redirect all error to the consoleFd */
}

void redirect_out()
{
    ioGlobalStdSet( 1, ioTaskStdGet(0,1) ); /* redirect all output to the current shell */
    ioGlobalStdSet( 2, ioTaskStdGet(0,1) ); /* redirect all error to the current shell */

    if (shellResourceReleaseHookAdd_once == 0) {
        shellResourceReleaseHookAdd(revert_out); /* call revert_out() when current shell closes. */
        shellResourceReleaseHookAdd_once = 1;
    }
}
于 2018-10-10T21:41:12.500 回答
0

一种解决方法是使用 ioGlobalStdSet 将 IO 重定向到管道。然后,在 RTP 中,以读取模式打开管道。

在我的脑海中 - 在内核中:

dev = pipeDevCreate("/pipe/input", 10, 100);
kernFd = open("/pipe/input", O_RD, 0)
ioGlobalStdSet(1, kernFd)

在 RTP 中:

rtpFd = open("/pipe/input", O_RD, 0); 读取(rtpFd,行,100);

于 2012-04-25T15:54:34.190 回答
0

在 VxWorks 配置和编译期间禁用 shell 永久消除了该问题。也可以在 shell 中输入 exit 以暂时禁用它。

于 2012-04-27T20:05:35.440 回答