указатель против дескрипторов в C (термины, используемые для передачи отдельных вещей?)

sys.stdin.read(1)

будет в основном читать 1 байт из STDIN.

Если вы должны использовать метод, который не дожидается \n, вы можете использовать этот код, как было предложено в предыдущем ответе:

class _Getch:
    """Gets a single character from standard input.  Does not echo to the screen."""
    def __init__(self):
        try:
            self.impl = _GetchWindows()
        except ImportError:
            self.impl = _GetchUnix()

    def __call__(self): return self.impl()


class _GetchUnix:
    def __init__(self):
        import tty, sys

    def __call__(self):
        import sys, tty, termios
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(sys.stdin.fileno())
            ch = sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        return ch


class _GetchWindows:
    def __init__(self):
        import msvcrt

    def __call__(self):
        import msvcrt
        return msvcrt.getch()


getch = _Getch()

( взято из http://code.activestate.com/recipes/134892/ )

20
задан Setjmp 17 December 2009 в 18:16
поделиться

13 ответов

The term handle generally means some opaque value that has meaning only to the API which produced it. In Win32, the HANDLE type is either a pointer in kernel memory (which applications cannot access anyway) or an index into some kernel-internal array.

45
ответ дан 29 November 2019 в 06:08
поделиться

A pointer is definitely different than a handle. A pointer is an address of something unspecified in memory. A pointer to a structure can be called a "handle" (usually by using 'typedef').

A handle is a concept used in writing the windows operating system. A pointer is a part of the C language.

0
ответ дан 29 November 2019 в 06:08
поделиться

Дескрипторы обычно представляют собой указатели, которые вам не нужно напрямую разыменовать. Скорее вы передаете их вызовам API, которые работают с базовыми структурами.

Исторически в Windows дескрипторы не были указателями. Вы должны заблокировать дескриптор, чтобы получить указатель перед его использованием, и разблокировать его, когда вы закончите (и указатель станет недействительным). В те дни, когда не было страничной памяти, старая школа Windows осуществляла собственное управление памятью, заменяя ресурсы, на которые ссылаются только дескрипторы, и возвращая их обратно, когда они были заблокированы. На практике это превратило управление памятью в кошмар, но позволило Windows имитировать виртуальную память в системах, не поддерживающих ее аппаратным обеспечением.

1
ответ дан 29 November 2019 в 06:08
поделиться

Windows определяет дескрипторы для многих вещей. Они вовсе не обязательно являются указателями - некоторые из них таковыми, но другие представляют собой такие вещи, как смещения в определенные таблицы. Некоторые из них намеренно запутаны. Есть дескрипторы для всего, от окон до контекстов устройств и растровых изображений и т. Д.

В любом случае дескриптор обычно подразумевается как непрозрачный тип данных, т.е. вы не должны ничего знать о его значении, только набор предопределенных операций, которые могут использовать его для выполнения различных задач. Я считаю, что C ++ / CLI также имеет объект, похожий на указатель, который называется дескриптором. Я считаю, что он должен быть ближе к непрозрачному типу данных - если память не изменяет, вам не разрешается выполнять какие-либо арифметические операции с указателями.

1
ответ дан 29 November 2019 в 06:08
поделиться

In the old days of MacOS programming, back before OSX, a handle was a pointer to a pointer. That allowed the OS to move things around without invalidating the user's pointers. There were rules on when we could assume the pointed-to object wouldn't move, which I don't remember.

2
ответ дан 29 November 2019 в 06:08
поделиться

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

3
ответ дан 29 November 2019 в 06:08
поделиться

A handle is a generic term for a reference (not specifically a C++ reference) to an object.

A pointer is a subset of handle, since it points to objects.

A foreign key in a database is also a handle, since it points to records in other tables; and it is not a pointer.

In the Windows API environment, they used the abstract term handle so they could use an integer into a table, a pointer, or other methods, without interfering with the client; IOW, defining an abstract interface.

In summary, a handle can be something other than a pointer, such as an integer index or an object containing more details about the object (such as a smart pointer).

2
ответ дан 29 November 2019 в 06:08
поделиться

Термин «дескриптор» не использовался в Windows, хотя он получил широкое распространение среди программистов Windows.

В стандартной библиотеке C (stdio.h) дескрипторы файлов являются указателями на структура данных, используемая библиотекой C.

Чистое программирование Unix использует файловые дескрипторы, которые являются индексами в структуре данных ядра, но указатели использовались как дескрипторы в Unix более 30 лет.

3
ответ дан 29 November 2019 в 06:08
поделиться

Термин дескриптор используется для обозначения любого метода, который позволяет вам получить доступ к другому объекту. Дескриптор может быть указателем, ссылкой, указателем на указатель и т. Д. Но убедитесь, что он связан с классами, объектами и т. Д. Так что дескриптор не всегда должен быть указателем на структуру.

-AD.

3
ответ дан 29 November 2019 в 06:08
поделиться

Поскольку вы ссылаетесь на дескрипторы, используемые как указатель на структуру, используемую программистом Windows, я отвечу в этом контексте. Обратите внимание, что существует множество различных видов «дескрипторов», поскольку это общая концепция, широко используемая в вычислительной среде. Конечно, вы знакомы с концепцией дескриптора файла; Windows также предлагает оконные ручки и многие другие ручки. При этом:

«Дескриптор памяти» (похожий на указатель на структуру) - это концепция из области 16-битного программирования Windows, где не было диспетчера памяти в ЦП, а все управление памятью было будет сделано в программном обеспечении. По сути, «дескриптор» был чем-то вроде указателя, но ОС могла бы свободно перемещаться по памяти, на которую ссылается дескриптор. Вы можете' Это можно сделать с помощью обычного указателя, но у дескриптора были функции, которые получали и освобождали фактический адрес памяти.

С появлением Win32, где у ЦП был аппаратный диспетчер памяти, концепция дескриптор памяти устарел. Другие типы дескрипторов, такие как дескрипторы файлов и окон, все еще существуют в Win32, но не являются указателями на структуры.

10
ответ дан 29 November 2019 в 06:08
поделиться

I use the word handle to mean a pointer that points to an "object" that represents a resource - often an OS resource, whereas a pointer just points to some memory. If you have a handle to something, you shouldn't try to read and write bytes into it directly, but manipulate it through provided methods.

Often handles are implemented as an opaque void *, which is further encouragement not to try to directly dereference it.

13
ответ дан 29 November 2019 в 06:08
поделиться

A handle is an old and revered concept.

A cookie is much the same thing. Or a GUID. Or a ticket to retrieve your car from a car park, or your coat from a fancy restaurant, etc.

Its any unique value that when presented back to the issuer can be used to track back to the actual thing referred, by whatever opaque mechanism the issuer wants. You may or may not know anything about that process, nor what the underlying thing is, exactly (only conceptually).

It was heavily used by Windows, but it is certainly not unique to Windows.

You would not normally use "handle" to mean "pointer to struct." Handle is more like "token" than like "pointer." It refers to something - file, system resource, memory, state-snapshot, etc. But what-exactly-it-is is based on the context of the handle itself (i.e. who issued the handle).

Handles were also used heavily in early filesystem programming in K&R C.

18
ответ дан 29 November 2019 в 06:08
поделиться

No, it is not particularly common amongst Windows programmers to refer to pointers as handles, but doing so isn't WRONG either. The term "handle" is usually used to describe something you use to access something through, and in that sense are all pointers handles (but not all handles are pointers). Win32's handles are AFAIK usually not pointers, but instead indices to internal OS tables - but this might change in future versions of Windows.

2
ответ дан 29 November 2019 в 06:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: