如何将控制台输出重定向到 VxWorks shell 中的文件?
How to redirect console output into a file in VxWorks shell?
在Windows或Linux中,我们经常将控制台输出重定向到一个文件,如下所示:
Windows:
dir > text
Linux:
ls -l > text
我想知道如何在 VxWorks 中做类似的事情 shell。
您可以尝试这样的操作:
-> saveFd = open("myfile.txt",0x102, 0777 )
-> oldFd = ioGlobalStdGet(1)
-> ioGlobalStdSet(1, saveFd)
-> runmytest()
...
-> ioGlobalStdSet(1, oldFd)
这会将所有代码重定向到您打开的文件,在本例中 myfile.txt
我把"saveFd = open("myfile.txt",0x102, 0777 )"中的"0x102"改成了"0x202",就可以了。所有控制台显示都被重定向到 "myfile.txt"。
之前的post,我搞错了。我以为它挂在 "ioGlobalStdSet(1, saveFd)" 之后。它没有挂起,而是将所有显示重定向到 "myfile.txt",我使用 "CTL-C" 停止重定向。
以下代码片段展示了如何将所有串行控制台输出保存到一个文件中。
尝试 -> tyco0_write_to_file 4096
#include <tyLib.h>
#include <private/iosLibP.h>
int tyco0_log_max_size = -1;
int tyco0_log_fd = -1;
int tyco0_write_hook(TY_DEV_ID pTyDev, char *buffer, int nbytes)
{
FD_ENTRY *p_fd_entry;
static int bytes_written = 0;
if ('0' == pTyDev->devHdr.name[6]) { /* /tyCo/0 */
if ((bytes_written+nbytes)<tyco0_log_max_size) {
(void)write(tyco0_log_fd,buffer,nbytes);
bytes_written += nbytes;
}
else {
(void)write(tyco0_log_fd,buffer,tyco0_log_max_size-bytes_written);
p_fd_entry = iosFdMap(1);
p_fd_entry->pDrvEntry->de_write = tyWrite;
close(tyco0_log_fd);
bytes_written = 0;
}
}
return tyWrite(pTyDev,buffer,nbytes);
}
int tyco0_write_to_file(int file_max_size)
{
FD_ENTRY *p_fd_entry;
p_fd_entry = iosFdMap(1); /* /tyCo/0 */
if (NULL==p_fd_entry) {
perror("iosFdMap");
return -1;
}
tyco0_log_fd = open("/ram/tyco0.log",O_CREAT|O_RDWR,0);
if (tyco0_log_fd == -1) {
perror("open");
return -1;
}
if (file_max_size <= 0) {
file_max_size = 1024;
}
tyco0_log_max_size = file_max_size;
if (p_fd_entry->pDrvEntry->de_write == tyWrite) {
p_fd_entry->pDrvEntry->de_write = tyco0_write_hook;
}
else {
printf("tyWrite not found\n");
close(tyco0_log_fd);
return -1;
}
return 0;
}
在Windows或Linux中,我们经常将控制台输出重定向到一个文件,如下所示:
Windows:
dir > text
Linux:
ls -l > text
我想知道如何在 VxWorks 中做类似的事情 shell。
您可以尝试这样的操作:
-> saveFd = open("myfile.txt",0x102, 0777 )
-> oldFd = ioGlobalStdGet(1)
-> ioGlobalStdSet(1, saveFd)
-> runmytest()
...
-> ioGlobalStdSet(1, oldFd)
这会将所有代码重定向到您打开的文件,在本例中 myfile.txt
我把"saveFd = open("myfile.txt",0x102, 0777 )"中的"0x102"改成了"0x202",就可以了。所有控制台显示都被重定向到 "myfile.txt"。 之前的post,我搞错了。我以为它挂在 "ioGlobalStdSet(1, saveFd)" 之后。它没有挂起,而是将所有显示重定向到 "myfile.txt",我使用 "CTL-C" 停止重定向。
以下代码片段展示了如何将所有串行控制台输出保存到一个文件中。
尝试 -> tyco0_write_to_file 4096
#include <tyLib.h>
#include <private/iosLibP.h>
int tyco0_log_max_size = -1;
int tyco0_log_fd = -1;
int tyco0_write_hook(TY_DEV_ID pTyDev, char *buffer, int nbytes)
{
FD_ENTRY *p_fd_entry;
static int bytes_written = 0;
if ('0' == pTyDev->devHdr.name[6]) { /* /tyCo/0 */
if ((bytes_written+nbytes)<tyco0_log_max_size) {
(void)write(tyco0_log_fd,buffer,nbytes);
bytes_written += nbytes;
}
else {
(void)write(tyco0_log_fd,buffer,tyco0_log_max_size-bytes_written);
p_fd_entry = iosFdMap(1);
p_fd_entry->pDrvEntry->de_write = tyWrite;
close(tyco0_log_fd);
bytes_written = 0;
}
}
return tyWrite(pTyDev,buffer,nbytes);
}
int tyco0_write_to_file(int file_max_size)
{
FD_ENTRY *p_fd_entry;
p_fd_entry = iosFdMap(1); /* /tyCo/0 */
if (NULL==p_fd_entry) {
perror("iosFdMap");
return -1;
}
tyco0_log_fd = open("/ram/tyco0.log",O_CREAT|O_RDWR,0);
if (tyco0_log_fd == -1) {
perror("open");
return -1;
}
if (file_max_size <= 0) {
file_max_size = 1024;
}
tyco0_log_max_size = file_max_size;
if (p_fd_entry->pDrvEntry->de_write == tyWrite) {
p_fd_entry->pDrvEntry->de_write = tyco0_write_hook;
}
else {
printf("tyWrite not found\n");
close(tyco0_log_fd);
return -1;
}
return 0;
}