Создание структуры (структуры данных) в сценарии оболочки - PullRequest
2 голосов
/ 17 сентября 2011

Я действительно новичок в этой области ...

Мой вопрос: как я могу создать структуру в сценарии оболочки (или bash, я не уверен в разнице)

В C, например, мы можем просто:

struct name
{
    __u8 x;
    __u8 y;
    signed short z;
    float t;
    float u;
};

Возможно ли создать что-то похожее на это в оболочке?

Почему?

Мне нужно скопировать некоторыезначения в файл / proc ... но я должен быть уверен, что они имеют размер 12 байт и порядок их расположения, потому что я хочу присвоить их предыдущей структуре, которая находится внутри модуля ядра linux

СпасибоВам за любой полезный ответ или подсказку

Ответы [ 2 ]

2 голосов
/ 17 сентября 2011

Могу ли я предложить лучший инструмент для работы, Python? Он установлен на большинстве систем Linux, и вы можете писать сценарии с ним, просто поместите соответствующий шебанг вверху:

#! /usr/bin/python

Или,

#! /usr/bin/env python

Затем используйте модуль struct для упаковки значений в двоичное представление.

#! /usr/bin/env python
import sys, struct
# Convert first 5 arguments
args = [f(arg) for f,arg in zip([int,int,int,float,float], sys.argv[1:])]
sys.stdout.write(struct.pack('BBhff',*args))

Что эквивалентно,

#! /usr/bin/env python
import sys, struct
x = int(sys.argv[1])
y = int(sys.argv[2])
z = int(sys.argv[3])
t = float(sys.argv[4])
u = float(sys.argv[5])
sys.stdout.write(struct.pack('BBhff',x,y,z,t,u))

И может быть вызван как:

./script.py 1 2 3 4.0 5.0 > /proc/somefile...

РЕДАКТИРОВАТЬ: Или читать из другого файла:

./script.py `cat args-file` > /proc/somefile...
1 голос
/ 17 сентября 2011

Вы можете использовать echo -en для выгрузки сырых байтов с помощью bash, например, echo -en "\000\001" выведет два байта: 0x00 и 0x01.Так что вам просто нужно знать конкретные байты, кодировать их как восьмеричные значения в вашем скрипте оболочки, а затем echo -en их в ваш файл proc.Я не думаю, что вам повезет, если вы попытаетесь преобразовать переменную bash в четырехбайтовое число с плавающей точкой;если вам нужно вычислить значения для вашего struct, тогда bash - не ваш лучший выбор.Держу пари, что кто-то здесь может придумать способ сделать это, но это не значит, что это правильно.

Есть ли у вас Perl, Ruby, Python, PHP?Все они имеют функцию pack для втирания собственных чисел в потоки байтов, которые будут соответствовать макету C struct.С любым из них вы могли бы сделать некоторые вычисления, pack значения в ваш 12-байтовый формат, а затем вывести их в ваш файл proc.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...