Автор Гілка: як запустити новий процес gedit (gnome)  (Прочитано 2254 раз)

Відсутній beroal

  • Новачок
  • *
  • дописів: 15
  • Карма: +0/-0
Деяка програма запускає зовнішній текстовий редактор, у моєму випадку gedit. Потрібно, щоб відкривався новий процес gedit, навіть якщо gedit-а вже є процес, і щоб gedit робив exclusive lock на файлі, аж поки процес не закінчиться.
Параметр --new-window просто створює нове вікно, а не новий процес.

Відсутній nickat

  • Письменник
  • *****
  • дописів: 587
  • Карма: +0/-0
  • Debian user
Re: як запустити новий процес gedit (gnome)
« Відповідей #1 : 2008-07-29 14:58:51 »
Так, з gedit проблематично.  Треба обов'язково його використовувати?  Мабуть це можна вказати через параметри компіляції gedit.

Якщо маєш доступ до коду програми, що запускає редактор, то можеш вбудувати такий саме механізм, як в lockfile (http://www.visi.com/cgi-bin/man?lockfile+1) - файли-семафори.  Тільки, щоб це працювало, всі інші програми (процеси), які звертаються до файлу, мають теж використовувати цей механізм.

Не знаю, чи можна поставити lock на файл на рівні ОС чи файлової системи.  Якщо так, то таке рішення буде напряму прив'язано до певної ОС чи ФС.  Тебе це влаштовує?

Ще можна спробувати так:

1. Відкриваєш файл у редакторі.
2. Відразу прибираєш всі права доступу до файлу.
3. Працюєш з файлом.
4. Безпосередньо перед збереженням файлу повертаєш права доступу.
5. Записуєш файл.

Але це хак, тому що між 1. і 2. та 4. і 5. інші процеси можуть встигнути отримати доступ до файлу ще до тебе.  Також у будь який момент можна просто замінити файл іншим (наприклад за допомогою mv), і права доступу на файл тут не допоможуть.
Best regards,
nickat

Відсутній beroal

  • Новачок
  • *
  • дописів: 15
  • Карма: +0/-0
Re: як запустити новий процес gedit (gnome)
« Відповідей #2 : 2008-07-30 05:11:14 »
Треба обов'язково його використовувати?
Ну а які є альтернативи (GUI, підсвітка мов) xemacs як на мене занадто складний.

Якщо маєш доступ до коду програми, що запускає редактор
Шлях до редактора настроюється.

Якщо маєш доступ до коду програми, що запускає редактор, то можеш вбудувати такий саме механізм, як в lockfile (http://www.visi.com/cgi-bin/man?lockfile+1) - файли-семафори.  Тільки, щоб це працювало, всі інші програми (процеси), які звертаються до файлу, мають теж використовувати цей механізм.
А хіба в Linux немає блокування, обовязкового для всіх? lockfile — це ж застарілий механізм.

Відсутній nickat

  • Письменник
  • *****
  • дописів: 587
  • Карма: +0/-0
  • Debian user
Re: як запустити новий процес gedit (gnome)
« Відповідей #3 : 2008-07-31 00:49:12 »
У чому саме полягає вихідна проблема?  Навіщо тобі два окремі процеси редактора та exclusive lock?

Ну а які є альтернативи (GUI, підсвітка мов) xemacs як на мене занадто складний.
тут тобі допоможе пошук в Інтернеті.  Я користуюсь саме emacs  :).

Шлях до редактора настроюється.
Якщо, exclusive lock потрібен лише для процесів цієї програми, то можна написати скрипт який створює файл-семафор, та перевіряє наявність семафора перед запуском редактора.  Потім у програмі вказуєш шлях до цього скрипту.

lockfile — це ж застарілий механізм.
З чого ти взяв?  Firefox, наприклад, саме його і використовує.

А хіба в Linux немає блокування, обовязкового для всіх?
Є - man fcntl.  Але там не все так просто.  Треба використовувати спеціальні опції під час приєднання файлової системи та встановити певні права доступу до файлу.  Ну, і звичайно треба написати програму, яка буде використовувати fcntl як тобі треба.
Best regards,
nickat

Відсутній beroal

  • Новачок
  • *
  • дописів: 15
  • Карма: +0/-0
Re: як запустити новий процес gedit (gnome)
« Відповідей #4 : 2008-07-31 04:33:16 »
У чому саме полягає вихідна проблема?  Навіщо тобі два окремі процеси редактора та exclusive lock?
Даруйте, не пояснив. Програма запускає gedit, передаючи йому шлях до файла. Коли процес gedit завершується, програма читає нову версію файла.

Тепер випадок, якщо ж процес gedit вже існує. Тоді програма запускає новий процес gedit, який у свою чергу посилає команду старому процесу gedit і завершується миттєво. Тож програма думає, що редагування файла завершене. Виникає дуже небезпечна ситуація, коли з файлом одночасно працюють і програма і gedit. Якщо б gedit робив exclusive lock, це як додаткова перестраховка, що програма не зможе міняти файл, коли він редагується в gedit.

lockfile — це ж застарілий механізм.
З чого ти взяв?  Firefox, наприклад, саме його і використовує.
Я мав на увазі ненадійний. Блокування має бути обов'язковим для всіх. Не кажучи вже про транзакції, але це вже я забагато хочу.

Відсутній nickat

  • Письменник
  • *****
  • дописів: 587
  • Карма: +0/-0
  • Debian user
Re: як запустити новий процес gedit (gnome)
« Відповідей #5 : 2008-08-04 22:08:43 »
В аттачменті невеличкий скрипт (safedit.sh).

У твоїй програмі замість шляху до редактору вказуєш шлях до safedit.sh.  Робиш safedit.sh редактором за замовченням для тих типів файлів до яких тобі потрібен виключний доступ.  Тепер, якщо програма намагатиметься відкрити файл, який ти вже відкрив за допомогою safedit.sh, ти отримаєш повідомлення, а програма файл не відкриє.  Аналогічне трапиться, якщо ти спробуешь декілька разів відкрити той самий файл за допомогою safedit.sh.

Для роботи safedit.sh потрібно пакунки lockfile-progs та zenity.  За редактор я взяв emacs, але ти можеш взяти будь який інший, тільки щоб він створював окремі процеси, а не так як gedit.

З gedit, я гадаю, нічого не вийде.  Опцій компіляції, які б дозволили змінити його стандартну поведінку, я не знайшов.

На даний час, це все, що я можу тобі запропонувати.

lockfile — це ж застарілий механізм.
З чого ти взяв?  Firefox, наприклад, саме його і використовує.
Я мав на увазі ненадійний. Блокування має бути обов'язковим для всіх. Не кажучи вже про транзакції, але це вже я забагато хочу.

Блокування має бути ефективним.  Кожен з видів блокування має свої переваги і недоліки.  Mandatory (exclusive) locking пов'язано з додатковими труднощами, які у твоєму випадку роблять його використання не вигідним.  Почитай man до fcntl.  Менш складного способу здійснити mandatory locking я ще не знайшов...  Буде цікаво дізнатися, якщо тобі це вдасться.
« Змінено: 2008-08-04 22:11:08 від nickat »
Best regards,
nickat

Відсутній beroal

  • Новачок
  • *
  • дописів: 15
  • Карма: +0/-0
Re: як запустити новий процес gedit (gnome)
« Відповідей #6 : 2008-08-06 13:52:21 »
Дякую і за це.