PseudoTerminal C - 如何

时间:2017-01-24 18:35:27

标签: c

我目前正在尝试创建一个应用程序,它将从客户端接收信息并将其发送到服务器中执行。为此,我需要使用PseudoTerminals。

我按照了一本书的例子,最后得到了这段代码

#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/stat.h>

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

    masterFd = posix_openpt(O_RDWR | O_NOCTTY);

    printf("Master: %d \n", masterFd);

    if(masterFd == -1)
        return -1;

    if(grantpt(masterFd) == -1 || unlockpt(masterFd) == -1)
    {
        savedErrno = errno;
        close(masterFd);
        errno = savedErrno;
        return -1;

    }

    p = ptsname(masterFd); /*Get the name of the of the slave*/

    if(p == NULL)
    {
        savedErrno = errno;
        close(masterFd);
        errno = savedErrno;
        return -1;
    }

    printf("Slave: %s \n", p);

    //*
    if(strlen(p) < snLen)
    {
        strncpy(slavName, p, snLen);
    }
    else
    {
        close(masterFd);
        errno = EOVERFLOW;
        return -1;
    }

    //*/
    return masterFd;
}

pid_t ptyFork(int *masterFd, char *slavName, size_t snLen)
{
    int mfd, slaveFd, saveErrno;
    pid_t childPid;
    char slname[MAX_SNAME];
    char cIn[100], cOut[100];
    int out = -1, in = -1;
    mfd = ptyMasterOpen(slname, MAX_SNAME);

    if(mfd == -1)
        return -1;

    if(slavName != NULL)
    {
        if(strlen(slname) < snLen)
        {
            strncpy(slavName, slname, snLen);
        }
        else
        {
            close(mfd);
            errno = EOVERFLOW;
            return -1;
        }
    }

    childPid = fork();

    if(childPid == -1)
    {
        saveErrno = errno;
        close(mfd);
        errno = saveErrno;
        return -1;
    }

    if(childPid != 0)
    {
        *masterFd = mfd;
        return childPid;
    }

    close(mfd);

    slaveFd = open(slname, O_RDWR);

    if(slaveFd != -1)
    {
        sprintf(cOut, "/tmp/out%d", slaveFd);
        sprintf(cIn, "/tmp/in%d",  slaveFd);
        mkfifo(cOut, S_IRUSR|S_IWUSR);
        out = open(cOut, O_RDWR|O_TRUNC|O_NONBLOCK);
        mkfifo(cIn, S_IRUSR|S_IWUSR);
        in = open(cIn, O_RDONLY|O_TRUNC);dup2(out, STDERR_FILENO);
        dup2(out, STDOUT_FILENO);
        dup2(in, STDIN_FILENO);
    }
    else
    {
        printf("Problem with slave\n\r");
        fflush(stdout);
    }

    //*
    if(dup2(slaveFd, STDIN_FILENO) != STDIN_FILENO || dup2(slaveFd, STDERR_FILENO) != STDERR_FILENO || dup2(slaveFd, STDOUT_FILENO) != STDOUT_FILENO)
    {
        printf("Error on duplicating Files");
        close(slaveFd);
        exit(0);
    }
    else
    {
        dup2(out, STDERR_FILENO);
        dup2(out, STDOUT_FILENO);
        dup2(in, STDIN_FILENO);
    }
     //*/

    return slaveFd;
}

问题是:

sprintf(cOut, "/tmp/out%d", childPid);
sprintf(cIn, "/tmp/in%d",  childPid);

即使我在main中打印它们也总是返回0,它们的值是952 ......

也使用echo&#34; ls&#34; &GT; &#34; / TMP / inxx&#34;和cat / tmp / outxx什么都不做。

我认为问题是当fork完成时,变量会丢失它们的值或者其他东西,因为它现在打印出错误消息,而不是主要的<(p)

int main(int argc, const char * argv[])
{
    // insert code here...
    int masterFd;
    pid_t slaveFd;
    char slavName[MAX_SNAME];
    slaveFd = ptyFork(&masterFd, slavName, MAX_SNAME);
    //close(masterFd);
    //while(1);
    return 0;
}

有人可以帮忙吗?

由于

0 个答案:

没有答案