У вас есть файл с шаблонами. 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...
).
Рассмотрим следующий пример:
#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()
, потому что семафор с данным именем не существует.