Страницы

Поиск по вопросам

Показаны сообщения с ярлыком exec. Показать все сообщения
Показаны сообщения с ярлыком exec. Показать все сообщения

среда, 22 января 2020 г.

Lock file in unix(Solaris)

#c #файлы #unix #exec #solaris


Вопрос следующий: в man-е Solaris написано, что захват файлов наследуется при exec,
однако, когда я захватываю файл на запись, а затем вызываю execlp(...) — открываю файл
в редакторе. Затем я создаю новую сессию и запускаю ту же программу, по идее процесс
должен остановиться в ожидании из-за флага F_SETLKW в fcntl(), но он также открывает
редактор... В чем может быть дело? 

#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define editor "nano"

int main(int argc, char *argv[]) {
    struct flock lock;
    int fd;

    if ((fd = open(argv[1], O_RDWR)) == -1) {
            perror("Cannot open file");
            exit(EXIT_FAILURE);
    }
    lock.l_type = F_WRLCK;
    lock.l_whence = SEEK_SET;
    lock.l_start = 0;
    lock.l_len = 0;

    if (fcntl(fd, F_SETLKW, &lock) == -1) {
            perror("fcntl failed");
            exit(EXIT_FAILURE);
    }

    execlp(editor, editor, argv[1], NULL);
    perror("exec is not working");
    exit(EXIT_FAILURE);

}

    


Ответы

Ответ 1



man 2 fcntl (Solaris) All locks associated with a file for a given process are removed when a file descriptor for that file is closed by that process or the process holding that file descriptor terminates В linux этот момент расписан более подробно: man 2 fcntl (Linux [man-pages-ru]) Если процесс закрывает любой файловый дескриптор, ссылающийся на файл, то освобождаются все блокировки процесса для этого файла, независимо от файлового дескриптора(ов), на который получена блокировка. Это плохо: это означает, что процесс может потерять свои блокировки на файл, такой как /etc/passwd или /etc/mtab, когда какой-либо причине библиотечная функция решает их открыть, прочитать и закрыть. В данном случае происходит следующее: nano открывает тот же файл, на который удерживается блокировка (на другом дескрипторе), читает его и закрывает. В момент закрытия блокировка теряется, как и описано выше.

пятница, 10 января 2020 г.

Запуск программы из консоли ubuntu и запуск через exec() php выдают различные результаты

#скрипт #php #ubuntu #exec


Есть скрипт на perl, который генерирует картинку из текста. Проблема в том, что скрипт
выдает различные результаты при запуске его из консоли Ubuntu и запуске через функцию
exec(). На выходе в картинке отсутствуют русские символы. Из-за чего это может быть?    


Ответы

Ответ 1



Возможно при запуске через exec() скрипт выполняется под другим пользователем у которого другая локаль.

Ответ 2



Вероятнее всего проблема в пользователях и правах доступа. Скрипт php выполняет другой пользователь, у которого нет доступа к шрифтам с русскими символами!

понедельник, 6 января 2020 г.

Не идёт поиск если искомая строка начинается с не входящих в регексп

#javascript #регулярные_выражения #exec


Здравствуйте!

Моя задача состоит в поиске 2х групп в строке:


+
последовательность # и 0




var regex = /(\+?)((?:#*\s?)*(?:0*\s?)*(?:[.,])?(?:0*\s?)*(?:#*\s?)*)/;

var goodStr = '+#####0.00#######)';
var badStr = '(+#####0.00#######)';

console.log(regex.exec(goodStr));
console.log(regex.exec(badStr));




Проблема состоит в том, что если в строке содержится искомое значение и после него
идут символы, я получаю результыты по обоим группам, но если символы перед искомой
строкой, не получаю никаких результатов.

Почему такое поведение, ведь я не указываю ему поиск с начала строки?

Заметил, что такая ситуция лишь при использовании группировки.
    


Ответы

Ответ 1



Пустая строка подходит под твою регулярку, поэтому она и выбирается. Поиск делается с самого левого из вхождений. Самое левое - это пустая строка в нулевой позиции - её ты и получаешь. Рекомендую как-то переделать регулярку, чтобы пустая строка не являлась корректным вариантом.

четверг, 26 декабря 2019 г.

Можно, ли перевести String в код java

#java #python #exec


В Python есть метод exec(), есть ли такое в Java?
    


Ответы

Ответ 1



Нет, python интерпретируемый язык программирования, в отличае от java. Инными словами для того, чтобы запусить код java, его вначале нужно скомпилировать.

Ответ 2



Из вопроса непонятно зачем работать с java в режиме интерпретации. Почитайте про JavaCompiler. В определенных случаях это может помочь.

понедельник, 17 июня 2019 г.

Использовать терминал с сессией через Ruby

Ruby дает выполнять команды •Nix терминала через System, Exec, Irb и тд, но у меня не получается сохранить сессию между командами. То есть я открываю консольное приложение в нем через, например, exec("./app"), но внутренние команды исполнить не могу, как сделал бы это через обычную сессию /bin/sh.
# ./app app> do_something
Вот этот do_something и "отпадывает".
Спасибо кто откликнется, может библиотеки знает по этой теме, всему рад.
UPD: То есть у меня есть ./app и внутри него мне надо исполнить ряд действий отлавливая вывод инфы и на ее основе слать команды дальше. А проблема, с которой я сталкиваюсь, это когда программа доходит до команды запуска приложения она перенаправляет меня в терминал и прерывается (ожидая завершения работы текущей программы), а мне нужно исполнить внутри открывшегося ./app еще команды.


Ответ

Читайте внимательнее документацию.
exec делает "немножко" не то, что вы ожидаете
Replaces the current process by running the given external command
...он замещает текущий процесс Ruby. То есть, на этой строчке ваша программа завершается, вместо неё ОС приклеивает процесс, который вы запустили.
Скорее всего, вам нужен модуль Open3 из стандартной библиотеки, а конкретно методы popen3 и/или popen2. Они запускают новый процесс, прицепив к его потокам стандартного IO подконтрольные Ruby потоки, а также создают отдельный Thread, который ждёт завершения процесса.
То, что вы вводили бы с клавиатуры, подавайте в полученный stdin нового процесса, и не забывайте читать его stdout и stderr, поскольку размер их буферов обычно ограничен, и их заполенность может повесить программу. В документации есть об этом детали.

воскресенье, 10 марта 2019 г.

Lock file in unix(Solaris)

Вопрос следующий: в man-е Solaris написано, что захват файлов наследуется при exec, однако, когда я захватываю файл на запись, а затем вызываю execlp(...) — открываю файл в редакторе. Затем я создаю новую сессию и запускаю ту же программу, по идее процесс должен остановиться в ожидании из-за флага F_SETLKW в fcntl(), но он также открывает редактор... В чем может быть дело?
#include #include #include #include #include #include #include
#define editor "nano"
int main(int argc, char *argv[]) { struct flock lock; int fd;
if ((fd = open(argv[1], O_RDWR)) == -1) { perror("Cannot open file"); exit(EXIT_FAILURE); } lock.l_type = F_WRLCK; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0;
if (fcntl(fd, F_SETLKW, &lock) == -1) { perror("fcntl failed"); exit(EXIT_FAILURE); }
execlp(editor, editor, argv[1], NULL); perror("exec is not working"); exit(EXIT_FAILURE);
}


Ответ

man 2 fcntl (Solaris) All locks associated with a file for a given process are removed when a file descriptor for that file is closed by that process or the process holding that file descriptor terminates
В linux этот момент расписан более подробно:
man 2 fcntl (Linux [man-pages-ru]) Если процесс закрывает любой файловый дескриптор, ссылающийся на файл, то освобождаются все блокировки процесса для этого файла, независимо от файлового дескриптора(ов), на который получена блокировка. Это плохо: это означает, что процесс может потерять свои блокировки на файл, такой как /etc/passwd или /etc/mtab, когда какой-либо причине библиотечная функция решает их открыть, прочитать и закрыть.
В данном случае происходит следующее: nano открывает тот же файл, на который удерживается блокировка (на другом дескрипторе), читает его и закрывает. В момент закрытия блокировка теряется, как и описано выше.