Используя Linux ioctl с Моно

Непосредственно из (старой) документации Python (рецепты для itertools):

from itertools import izip, chain, repeat

def grouper(n, iterable, padvalue=None):
    "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"
    return izip(*[chain(iterable, repeat(padvalue, n-1))]*n)

Текущая версия, предложенная JFSebastian:

#from itertools import izip_longest as zip_longest # for Python 2.x
from itertools import zip_longest # for Python 3.x
#from six.moves import zip_longest # for both (uses the six compat library)

def grouper(n, iterable, padvalue=None):
    "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"
    return zip_longest(*[iter(iterable)]*n, fillvalue=padvalue)

Я думаю, машина времени Гвидо работает - работал - будет работать - будет работать - снова работал.

Эти решения работают, потому что [iter(iterable)]*n (или эквивалент в более ранней версии) создает один итератор, повторенный n раз в списке. izip_longest затем эффективно выполняет циклический перебор «каждого» итератора; поскольку это один и тот же итератор, он продвигается при каждом таком вызове, что приводит к тому, что каждый такой zip-roundrobin генерирует один кортеж из n элементов.

5
задан rozon 21 June 2009 в 16:30
поделиться

3 ответа

Mono не содержит оболочки для ioctl в Mono.Unix, потому что параметры вызова ioctl сильно различаются, и такая оболочка была бы почти бесполезной. Вы должны объявить DllImport для каждого ioctl, который вам нужен.

Вам, вероятно, не нужна вспомогательная библиотека, написанная на C, однако она может понадобиться вам во время разработки для извлечения фактических значений, скрытых за другим препроцессором C. макросы. Например, чтобы развернуть заголовок C:

#define FE_GET_INFO                _IOR('o', 61, struct dvb_frontend_info)

скомпилируйте и выполните этот помощник:

#include <linux/dvb/frontend.h>
#include <stdio.h>

int main()
{
  printf("const int FE_GET_INFO = %d;\n", FE_GET_INFO);
  return 0;
}

Краткое обсуждение в монофоническом списке рассылки по теме .

3
ответ дан 14 December 2019 в 04:45
поделиться

You should write a wrapper library for your exact calls. Look at how Mono.Unix wraps syscalls (google codesearch for Mono.Unix Syscall.cs) to get the idea. Then create a wrapper for each specific ioctl command, which uses your own representation of the data.

As jitter said - you'll need to DLLImport the ioctl itself.

2
ответ дан 14 December 2019 в 04:45
поделиться

ioctl не поддерживается Mono AFAIK. Слишком уж зависит от ОС и список параметров зависит от фактического запроса. Вы можете попробовать DLLImport

Interop with Native Libraries

2
ответ дан 14 December 2019 в 04:45
поделиться
Другие вопросы по тегам:

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