将字符串从 c 发送到伪终端以模拟串行设备

问题描述

我目前正在尝试将数据手动输入 GPSD。为此,我有一个脚本,当前将数据(它只是一个 JSON 字符串)输出到 stdout,然后使用 socat 制作一种假串行设备。但是,我不想使用另一个过程,因此基本上我想将创建、链接和持续写入从该 c 代码集成到 pty。这是我目前拥有的,它只是一些将字符串写入 pty 的测试代码。但是当我在设备运行时进入设备时,什么也没有显示。'

#include <sys/stat.h>
#include <fcntl.h>
#define _XOPEN_SOURCE 600
#include <termios.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#define MAX_SNAME 1000  
int posix_openpt(int flags){
    return open("/dev/ptmx",flags);
}

int ptyMasterOpen(char *slaveName,size_t snLen){
    int masterFd,savedErrno;
    char *p;

    masterFd = posix_openpt(O_RDWR | O_NOCTTY);         /* Open pty master */
    if (masterFd == -1)
        return -1;

    if (grantpt(masterFd) == -1) {              /* Grant access to slave pty */
        savedErrno = errno;
        close(masterFd);                        /* Might change 'errno' */
        errno = savedErrno;
        return -1;
    }

    if (unlockpt(masterFd) == -1) {             /* Unlock slave pty */
        savedErrno = errno;
        close(masterFd);                        /* Might change 'errno' */
        errno = savedErrno;
        return -1;
    }

    p = ptsname(masterFd);                      /* Get slave pty name */
    if (p == NULL) {
        savedErrno = errno;
        close(masterFd);                        /* Might change 'errno' */
        errno = savedErrno;
        return -1;
    }

    if (strlen(p) < snLen) {
        strncpy(slaveName,p,snLen);
    } else {                    /* Return an error if buffer too small */
        close(masterFd);
        errno = EOVERFLOW;
        return -1;
    }

    return masterFd;
}

int main(int argc,char **argv) {
    int flags = O_RDWR | O_NOCTTY | O_NDELAY;
    char slavename[MAX_SNAME];

    ptyMasterOpen(slavename,900);
    printf("%s",slavename);
    int fd = open(slavename,flags);
    char msg[] = "hello there......General Kenobi\n";
    for(;;){
        write(fd,msg,sizeof(msg));
    }
    close(fd);

    
}       

     

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)