использование канала в виртуальном tty - PullRequest
1 голос
/ 12 июля 2011

Я использую простое программирование канала для написания и чтения tty, которое было сделано путем вставки кода программы из книги драйверов устройств Linux версии 3 o′reilly я вставил это через insmod и получил устройство с именем tinytty0.

мой вопрос: могу ли я использовать это устройство для чтения и записи данных по каналу? Я попытался один раз, данные записываются в драйвер, но чтение не было сделано. Я не знаю, в чем причина. код указан ниже

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include<fcntl.h>

int main(void)
{
        int     fd[2], nbytes;
        pid_t   childpid;
        char    string[] = "Hello, world!\n";
        char    readbuffer[80];



        pipe(fd);

        if((childpid = fork()) == -1)
        {
                perror("fork");
                exit(1);
        }

        if(childpid == 0)
        {
                /* Child process closes up input side of pipe */
                close(fd[0]);
            fd[1]=open("/dev/ttytiny0",O_WRONLY);   
        if(fd[1]<0)
        {
            printf("the device is not opened\n");
            exit(-1);
        }   
                /* Send "string" through the output side of pipe */
                write(fd[1], string, (strlen(string)+1));
                exit(0);
        }
        else
        {

                /* Parent process closes up output side of pipe */
                close(fd[1]);
        fd[0]=open("/dev/ttytiny0",O_RDONLY);
        if(fd[0]<0)
        {
            printf("the device is not opened\n");
            exit(-1);
        }
                /* Read in a string from the pipe */
                nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
                printf("Received string: %s", readbuffer);
        }

        return(0);
}

1 Ответ

1 голос
/ 19 июля 2011

Возможно, вы не понимаете, что делает драйвер tinytty из книги Linux Device Drivers. Из книги:

Этот крошечный tty драйвер не подключается к реальному оборудованию, поэтому его функция записи Он просто записывает в журнал отладки ядра, какие данные должны были быть записаны.

Это не какой-то петлевой драйвер TTY, фактически он отправляет постоянный символ ('t') каждые две секунды всему, что читает с устройства (см. Функцию tiny_timer).

Теперь перейдем к вашим проблемам с трубами. Из вашего кода я вижу, что вы по сути создали канал. Затем в дочернем процессе вы закрываете конец чтения канала и отбрасываете конец записи, заменяя его дескриптором файла на ваше устройство tiny tty (что является плохой практикой, поскольку вы в основном утекли дескриптор открытого файла) , Затем в родительском процессе вы закрываете конец записи канала и отбрасываете конец чтения (все еще плохая практика, т. Е. «Утечка дескрипторов открытого файла»). Наконец, в том же родительском процессе вы пытаетесь прочитать то, что вы называете pipe, который больше не является каналом, поскольку вы закрыли один конец и заменили другой дескриптором на устройство tiny tty. Более того, таймер в драйвере (который срабатывает каждые две секунды), вероятно, не сработал, а это значит, что вам нечего читать. Я считаю, что это объясняет вашу проблему.


Для всех, кто интересуется, упомянутая здесь книга доступна на условиях лицензии Creative Commons Attribution-ShareAlike 2.0 от LWN.net , а пример драйверов / кода доступен по O'Reilly .

...