системный вызов sleep в Linux - взаимодействие с сигналами

Si bien su código está bien escrito, hay mucha duplicación. Aquí hay una versión más condensada:

#!/bin/bash
declare -A count
for file in demo_room/subject_1/*; do
    base=${file##*/}
    case $base in
        slide_[12]*) key=${base:0:7};;
        [ldopt]*)    key=${base:0:1};;
        *)           ;; # other types ignored
    esac
    (( count[$key]++ ))
    echo "$key=${count[$key]}"
    python motempl_n.py "$file" "${count[$key]}"
done

Estoy usando una matriz asociativa en lugar de distintas variables enteras, pero afortunadamente bash maneja la aritmética (( an_unset_variable++ ))con gracia y asigna "1" a la variable.

Tenga en cuenta que el ?en su ?*era redundante ya que los nombres de archivo siempre contienen al menos un carácter, por lo que no hay ningún archivo que coincida con*(0 o más caracteres )y?*(1 o más los caracteres )no lo harían.

1
04.07.2019, 16:32
2 ответа

Комментарии из источника texinfo немного более явные:

@deftypefun {unsigned int} sleep (unsigned int @var{seconds})
@standards{POSIX.1, unistd.h}
@safety{@prelim{}@mtunsafe{@mtascusig{:SIGCHLD/linux}}@asunsafe{}@acunsafe{}}
@c On Mach, it uses ports and calls time.  On generic posix, it calls
@c nanosleep.  On Linux, it temporarily blocks SIGCHLD, which is MT- and
@c AS-Unsafe, and in a way that makes it AC-Unsafe (C-unsafe, even!).

За исключением того, что это ложь; sleep(3)в Linux не будет блокировать SIGCHLD; это всего лишь остатки старого обходного пути (, удаленного в 2015 году)для еще более старой ошибки Linux (, исправленной в 2.6.32 ).

Это коммит , который представил этот язык:

* manual/time.texi: Document MTASC-safety properties.
author  Alexandre Oliva <aoliva@redhat.com> 
    Sat, 1 Feb 2014 04:51:51 +0000 (02:51 -0200)
committer   Alexandre Oliva <aoliva@redhat.com> 
    Sat, 1 Feb 2014 04:51:51 +0000 (02:51 -0200)
commit  23e5b8cb1ba7a31450bda75e3f06b7c76e175db4
1
27.01.2020, 23:41

Тот, у кого больше опыта работы с внутренностями Linux, может меня поправить, но из документации похоже, что они хотят оставить за собой право реализовать sleep()через alarm(), что временно установит обработчик для SIGALRM.

Это не тот SIGCHLD, который упоминается в фактической документации, но он все равно подпадает под «MT -Небезопасный сигнал».

0
27.01.2020, 23:41

Теги

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