Как открыть двунаправленную трубу в c - PullRequest
3 голосов
/ 26 февраля 2020

Как открыть трубу для чтения и записи в си? Функция popen может быть открыта только в одностороннем режиме, и мне нужно получить вывод программы в php в s

1 Ответ

2 голосов
/ 26 февраля 2020

Com принять команду

 void pcreate(char* com, int* fdin_, int* fdout_)
    {
        pid_t pid;
        int pipe_in[2];
        int pipe_out[2];
        pipe(pipe_in);
        pipe(pipe_out);
        pid = fork();
        if (pid > 0)
        {
            close(pipe_in[0]);
            close(pipe_out[1]);
            *fdin_ = dup(pipe_in[1]);
            *fdout_ = dup(pipe_out[0]);
        }
        else if (pid == 0 )
        {
            close(pipe_in[1]);
            close(pipe_out[0]);
            dup2(pipe_in[0], 0);
            dup2(pipe_out[1], 1);

            int size = 2;
            int comlenght = (int)strlen(com);
            for (int i = 0; i < comlenght; i++)
            {
                if (com[i] == ' ')
                    size++;
            }
            char* args[size];
            comparse(com, args, size);
            if (execvp(args[0], args) < 0)
                _exit(0);
        }
    }

    void comparse(char* com, char* args[], int comlenght)
    {

        long del = 0;

        char *com1 = com;
        char *com2 = com1;
        for (int i = 0; i < comlenght - 1; i++)
        {
            com2 = strstr(com1, " ");
            if (com2 == NULL)
                del = (long)strlen(com1);
            else
                del = com2 - com1;
            args[i] = malloc((unsigned)(del+1) * sizeof (char));
            args[i][del] = '\0';
            strncpy(args[i], com1, (unsigned)del);
            com1 = com2 + 1;

        }
        args[comlenght - 1] = NULL;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...