LINUX.ORG.RU

Дескриптор потока ввода-вывода

 , ,


1

2

Здраствуйте,изучаю си и в книге сказано,ну книга не по си а по системному программированию на линукс как бы по си но не полностью,что поток ввода имеет дескриптор 0 и поток вывода имеет дескриптор 1.Как поток ввода вывода может быть файлом?

Перемещено hobbit из general



Последнее исправление: dawlah (всего исправлений: 2)
Ответ на: комментарий от beastie

Аааа,пазл начинает складываться.Так как каждый процесс по умолчанию имеет поток ввода-вывода,получается что каждый процесс открывает файлы с дескриптором 0,1,2 а так как вывод файлов в линукс можно перенаправлять,то можно перенаправить вывод одной программы в ввод другой,или вывод программы в другой файл.Взрыв мозга просто,че этого в винду сцаную то не принесли??.Кстати,я тут поигрался с чем то названным мышкой в /dev/input/mouse,ну как бы понятно что это,наверное драйвер,не уверен,и если перенаправить вывод из этого файла в другой файл и в процессе двигать мышкой то в файл будут заносится данные в бинарном виде.И вот в чем вопрос:можно ли хотя бы в теории так сделать рисование на экране просто движением мыши?Типа в файл наверное выводились данные об позиции мыши и кликах,и если уметь расшифровать бинарный код то наверное можно каким либо образом рисовать без всяких гимпов

dawlah
() автор топика

Дескрипторы - это не файлы. Вопрос немного кривой - «как поток ввода вывода может быть файлом». А это и не файл. Это дескриптор.

Дескриптор - это что-то, что описывает некую структуру в ядре, из которой можно читать или в неё записывать. Это может быть файлом или сокетом или чем-то ещё. С точки зрения кода на СИ это число.

lesopilorama
()

Файл это абстракция. Файлов, каталогов не существует в смысле самих по себе. Это представления механизмов доступа к данным, которые дают файловые системы, или выражаются в этом виде, ты можешь в них писать, ты можешь из них читать. И в своё время люди смекнули, что так как любая программа имеет ввод и вывод, то это можно представить как чтение из файла и запись в файл. На уровне взаимодействия и пользователя и разработчика, файл это или структура данных, указав которую специальным функциям можно читать и писать или номерок на который можно сослаться или получить его при открытии. Сами структуры файлов имеют просто индексы, дескрипторы, номерки, первый, второй, тысячный, это просто удобно и разработчику, и пользователю и самому ядру, всем.

Так почему бы не взять и не зарезервировать парочку, троечку дескрипторов, номерков и сказать, вот от сюда ты можешь читать как из файла, всё что ввёл пользователь, а вот сюда как в файл ты можешь писать всё что насчитал, а вон туда можешь ошибки писать.

Поглядели на это всё, и увидели что это хорошо. Внутри реализация может быть любой, например виртуальный файл, представляющий собой структуру, с которой можно работать через те же самые функции что и с любым другим файлом, но на деле это просто кусок памяти в оперативке, или это устройство, например звуковая карта, просто читаешь её как файл, а реализация представления её файлом то есть вычитывание звукового потока и выдача потока байт в запрашиваемую функцию дело десятое.

Так и порешили, что для давайте договоримся что файлы с дескрипторами под номерами 1 2 3 мы явно опишем, а дальше не наше дело, а для устройств сделаем возможность писать модули ядра которые предоставляют API создающие виртуальные, блочные устройства, с сетью тоже самое, пусть пишут в сокет/файл и читают из сокета/файла.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от dawlah

И вот в чем вопрос:можно ли хотя бы в теории так сделать рисование на экране просто движением мыши?Типа в файл наверное выводились данные об позиции мыши и кликах,и если уметь расшифровать бинарный код то наверное можно каким либо образом рисовать без всяких гимпов

Можно, ты правильно думаешь. Тебе надо считывать поток, и интерпретируя его делать дальше всё что захочешь

#include <stdio.h>

int main(int argc, char *argv[])
{
    FILE * mouse = fopen("/dev/input/mouse0","rb");
    char event[3] =
    {
        0, /*кнопочки и прочее, 7 бит на разные данные*/
        0, /*сдвиг по x -1 или 0 или +1*/
        0, /*сдвиг по y, тож самое*/
    };
    while(1)
    {
       fread(event,sizeof(event),1,mouse);
       char * cho_nahzato = NULL;
       switch(event[0] & 3) /*первые 2 бита про кнопки мышки */
       {
          case 0: cho_nahzato = "НЕТ НАЖАТИЙ"; break;
          case 1: cho_nahzato = "ЛЕВАЯ КНОПКА"; break;
          case 2: cho_nahzato = "ПРАВАЯ КНОПКА"; break;
          case 3: cho_nahzato = "ЛЕВАЯ + ПРАВАЯ"; break;
          default: cho_nahzato = "ЛЯЛЯЛЯЛЯ";break;

       }
       printf("%s %d %d\n",cho_nahzato,event[1],event[2]);

       /*тереперь имея бесконечный поток нажатий и смещений
        *можно отображать движения в чём угодно, например в картинке
        или в чём-то что обновляется постоянно на экране*/
    }
    return 0;
}

Время будет надо терминальную рисовалку сделать :D

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)

Дескриптор это номер открытого чего-то там в списке открытых чего-то там твоей программы. У каждого процесса этот список свой. Это «что-то» открытое - не обязательно файл, но это «что-то» обычно можно либо читать, либо писать, либо и то и то, и принято называть файлом.

При запуске программы часть этой таблицы может быть уже заполнена программой, которая её запустила (то есть родительским процессом), а всё остальное - пустое незанятое, с теми номерами программа может сама что-то открывать.

И вот под номером 0 программе при её запуске обычно подсовывают поток ввода, чем бы он ни был, многие программы рассчитывают на это и пытаются из дескриптора 0 считывать что-то.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Да разве такой напугаешь? Единственное, что вместо файловых дескрипторов, о которых узнал ТС, там потоки ввода/вывода, о которых от может ещё не знает. Вот страшная простыня https://stackoverflow.com/questions/38197517/interpretation-of-input-event-me... с переключением протокола, чтобы ещё колесо читать.

Главное, не говорить ТС, что между чтением из /dev/input/mice и рисованием чего-то в GUI целая пропасть :)

mky ★★★★★
()
Ответ на: комментарий от mky

между чтением из /dev/input/mice и рисованием чего-то в GUI целая пропасть

int 33 + int 10 + A000:0000 = любовь

(до крайней мере до тех пор, пока не надо всё то же самое напечатать иглами на принтере)

Toxo2 ★★★★★
()
Последнее исправление: Toxo2 (всего исправлений: 1)
Ответ на: комментарий от Toxo2

Для угнавшего машину времени, сейчас 2026. Это уже некрофилия и прочие извращения, а не любовь, у кого EFI, у кого ARM, а принтеры давно иголки потеряли.

mky ★★★★★
()
Ответ на: комментарий от dawlah

Почитай что-то ещё, используй разные источники, в интернете всякие дурачки, вроде меня, порой такие глупости пишут, что хоть стой, хоть под столом валяйся, поэкспериментируй сам проверив как оно в реальности всё работает, а не по описаниям. И будет хорошо и даже лучше :)

LINUX-ORG-RU ★★★★★
()

Как поток ввода вывода может быть файлом?

Теорию уже объяснили выше, а на практике это организовать очень просто: запустить программу с перенаправлением ввода, например

tr '\0' ' ' < /proc/$pid/cmdline

или вывода

тут_любая_команда >stdout.txt 2>stderr.txt

В этих примерах дескрипторы 0 (в первом) и 1 и 2 (во втором) окажутся связаны с самыми настоящими файлами, прям как если бы ты их руками в сишном коде open’ом открыл по имени файла

annulen ★★★★★
()

И зачем же ты постишь это в General при живом Development?

По теме написали выше: это юникс, тут всё есть файл. Абстракция такая. Иногда дырявой оказывается, да.

hobbit ★★★★★
()

Весь Unix - это кучка мелких и быстрых программ, которые срут друг в друга текстом через stdin и stdout. Что такое Интернет? Это куча мелких людишек, которые срут друг в друга текстом. Unix и Интернет… Они созданы друг для друга.

Lusine
()