Использование аппаратного управления потоком CTS / RTS на USB

Переменные оболочки трудно дублировать.

$ FOO=bar
$ FOO=zot
$ echo $FOO
zot
$ 

Однако переменные окружения могут дублироваться; это просто список, а в списке могут быть повторяющиеся записи. Вот envdup.c, чтобы сделать именно это.

#include 
#include 
#include 
#include 

extern char **environ;

int main(int argc, char *argv[]) {
    char **newenv;
    int envcount = 0;

    if (argc < 2) errx(64, "Usage: envdup command [args ..]");

    newenv = environ;
    while (*newenv++ != NULL) envcount++;

    newenv = malloc(sizeof(char *) * (envcount + 3));
    if (newenv == NULL) err(1, "malloc failed");
    memcpy(newenv, environ, sizeof(char *) * envcount);
    newenv[envcount]   = "FOO=bar";
    newenv[envcount+1] = "FOO=zot";
    newenv[envcount+2] = NULL;

    environ = newenv;
    argv++;
    execvp(*argv, argv);
    err(1, "exec failed '%s'", *argv);
}

Который мы можем скомпилировать и запустить, сообщив envdup, чтобы затем запустить env, чтобы показать нам, какие переменные окружения установлены...

$ make envdup
cc     envdup.c   -o envdup
$ unset FOO
$ ./envdup env | grep FOO
FOO=bar
FOO=zot
$ 

Возможно, это полезно только для поиска ошибок или другие странности в том, насколько хорошо программы обрабатывают **окружение.

$ unset FOO
$ ./envdup perl -e 'exec "env"' | grep FOO
FOO=bar
$ ./envdup python3 -c 'import os;os.execvp("env",["env"])' | grep FOO
FOO=bar
FOO=zot
$ 

Похоже, Python 3.6 здесь слепо пропускает дубликаты (дырявая абстракция), а Perl 5.24 — нет. Как насчет ракушек?

$ ./envdup bash -c 'echo $FOO; exec env' | egrep 'bar|zot'
zot
FOO=zot
$ ./envdup zsh -c 'echo $FOO; exec env' | egrep 'bar|zot' 
bar
FOO=bar
$ 

Боже, что произойдет, если sudo очистит только первую запись среды, а затем bash запустится со второй? Здравствуйте, эксплойт PATH или LD_RUN_PATH. Ваш sudoвсе остальные?) исправлены для этой дыры? Эксплойты безопасности не являются ни «случайным отличием», ни просто «ошибкой» в вызывающей программе.

1
18.10.2016, 16:48
2 ответа

В качестве временного решения, пока не обнаружите проблему, вы можете использовать pv , чтобы ограничить пропускную способность, например, до 100 байт / сек:

pv -L 100 -q < ~/my_RML_file > /dev/ttyUSB0
0
28.01.2020, 01:09

На сайте startech в настоящее время представлено несколько последовательных кабелей USB < ->. И эти разные продукты используют разные чипсеты, то есть, по крайней мере, FTDI и Prolific. И только Prolific поддерживает аппаратное управление потоком.

Вы можете проверить, есть ли у вас USB-устройство Prolific или FTDI, взглянув на dmesgпри подключении устройства.

После проверки USB-кабеля вы можете отладить аппаратное управление потоком данных, запустивstatserialв отдельном терминале.


Если ваше последовательное устройство не подключено напрямую к последовательному кабелю USB < ->, имеет смысл также проверить соединения этого дополнительного кабеля.

1
19.06.2021, 10:23

Теги

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