2017-08-17 46 views
0

我试图将Vxworks应用程序移植到Linux。为了将其中一个串行设备的I/O重定向到标准I/O,它们使用ioTaskStdSet();在vxworks中。 但我无法像linux那样在linux中找到api。在Linux中只有复制设备可用,这也不适用于我的应用程序。什么是将串行设备的I/O重定向到Linux中的标准I/O的API?

任何人都可以帮我解决这个问题吗?

+3

除'dup2()'以外? –

+1

我们需要[mcve]。目前还不清楚你在这里尝试了什么。 –

回答

0

由于@Ignacio提到dup2正是用于此目的。例如这个节目标准输出重定向到“回声”文件:

#include <fcntl.h> 
#include <stdlib.h> 
#include <sys/stat.h> 
#include <unistd.h> 

int main(int argc, char *argv[]) { 
    int fd = open("echo", O_RDWR | O_CREAT, 00644); 
    if(fd == -1) 
     return 1; 

    if(dup2(fd, 1) == -1) 
     return 1; 
    close(fd); 

    system("echo Hi!"); 
    return 0; 
} 
+0

如果我想使用旧的文件描述符,我可以忽略关闭(fd)?我在多个线程中使用此复制,但它只在一个线程中工作。在第二个线程再次stdi/o重定向到第二个终端。我应该如何使用多线程将stdi/o重定向到多个终端? – jyothi

+0

@jyothi:如果你使用旧的文件描述符(假设你调用'write(fd,...)'),那么为什么你需要复制一些东西?所以不,在'dup2'之后,你通常会调用'close'。关于线程和终端,我不确定要理解。我认为你的问题可能非常有趣,但我们需要一些例子,如果你编辑你的帖子,这将是非常棒的。例如,当你说:“我在多个线程中使用此复制,但它只能在一个线程中工作”时,很难在看不到您的代码的情况下为您提供帮助。 – vonaka

+0

我目前正在使用4个端口工作在telnet客户端应用程序上。这就是为什么对于我的应用程序要求,我想使用两者。 – jyothi

0
int main() 
{ 
    for(i=0;i<4;i++) 
    { 
     sprintf(dev_name,"tsports%d",i); 
     fd[i] = open(dev,O_RDWR | O_SYNC); 
     pthread_create(tid[i],NULL,&thread_fun,(void *)fd[i]); 
    } 
    pthread_exit(NULL); 
} 
int thread_fun(void *chan) 
{ 
    int new_fd,old_fd; 
    old_fd = (int)chan; 

    new_fd = dup2(old_fd,0); 
    new_fd = dup2(old_fd,1); 
    ts_fd = old_fd; 
    tn(); 
    pthread_exit(NULL); 
} 
void tn() 
{ 
    printf("hello on terminal"); 
    while(1) 
    { 
      read(ts_fd,&ch,1); 
      /* command line */ 
      ........ 
      ........ 
      ........ 

      /* starts telnet client application on terminal port*/   
      ....... 
     ...... 
      ...... 
      ....... 
      sleep(1); 
    } 
} 

In the above code while taking input from terminal 1 it is again redirecting stdi/o to terminal 2 in second thread. 

所以我想线程特定STDI /即使重定向每个终端邻。这在Vxworks中作为IoTaskStdSet API可用。 是否可以在Linux中实现?