Как открыть существующий именованный семафор?

У вас есть файл с шаблонами. grepможет считывать паттерны с опцией -f. Если вы хотите проверить, соответствует ли строка $inputшаблону в patterns.txt, вы можете сделать

printf '%s\n' "$input" |
if grep -q -f patterns.txt; then
    echo 'matches'
else
    echo 'does not match'
fi

Это запустит grepсодержимое строки с шаблонами в patterns.txt. В bashвы могли бы вместо этого использовать здесь -строку:

if grep -q -f patterns.txt <<<"$input"; then
    echo 'matches'
else
    echo 'does not match'
fi

-qостанавливает grepпроизводство вывода (нас интересует только статус выхода ).

Если шаблоны являются фиксированными строками (, а не регулярными выражениями ), используйте -Fс grepв дополнение к другим флагам(grep -qF -f...).

0
29.05.2021, 19:54
1 ответ

Рассмотрим следующий пример:

#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    const char* const sem_name = "lock.sem";

    if (argc == 1) {
        sem_t* const sem = sem_open(sem_name, O_CREAT, 0644, 0);

        if (sem == NULL) {
            perror("sem_open");
            return 1;
        }

        sem_wait(sem); // Will block
        sem_close(sem);

        sem_unlink(sem_name);
    } else {
        sem_t* const sem = sem_open(sem_name, 0);

        if (sem == NULL) {
            perror("sem_open");
            return 1;
        }

        sem_post(sem); // Will unblock the other process
        sem_close(sem);
    }

    return 0;
}

Я использую счетчик аргументов для управления поведением программы.

Если я не укажу никаких параметров (, т.е. когда argc == 1), то программа откроет семафор, создав его, если он еще не существует; он инициализирует значение семафора 0. Затем он выполняет sem_wait()для объекта sem. Поскольку семафор был инициализирован значением 0, это приводит к блокировке процесса.

Теперь если я запущу второй экземпляр этой же программы, но на этот раз с любым не -нулевым числом аргументов (т.е. при argc != 1), то программа откроет семафор, но не создаст это, если он еще не существует. Обратите внимание, что я передаю 0для параметра oflag(, т. е. я не передаю никаких флагов ). Затем программа выполняет sem_post(), увеличивая значение семафора с 0до 1. Это разблокирует первый процесс. Оба процесса закроют свои ссылки на семафор и завершатся.

Если я правильно понял ваш вопрос, второй случай — это то, что вам нужно.

Если я попытаюсь сначала запустить второй случай (, т. е. когда нет запущенного экземпляра первого случая ), я получу:

$./a.out foo
sem_open: No such file or directory

Это исходит от вызова perror(), потому что семафор с данным именем не существует.

2
28.07.2021, 11:28

Теги

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