Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Руководить процессом, Использование kill() 
:(
    Опции темы
ABC123
Дата 4.9.2014, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 4.9.2014

Репутация: нет
Всего: нет



Здравстуйте, 
При нажатии разных кнопок хочу запускать, останавливать, паузировать и возобновлять процесс.
Только проблема такая. Запускается процесс нормально, останавливается не сразу, а ждет пока файл воспроизведется до конца. Тоже самое и при вызове паузы. А вот из паузы выйти совсем не удается ( игнорируется сигнал?). Скрипт запускает просмотр видео и аудио файлов. Ошибка в коде? 
Вот такой код: 

Код

#include <stdio.h>
#include <unistd.h>
#include <wiringSerial.h>[quote]
[/quote]
#include <time.h>
#include <stdlib.h>
char uart_input;
pid_t pid;
int trigger=1;
 
int main(void){
int uart_device = ("/dev/ttyAMA0", 115200);
while(trigger==1) {
 
uart_input = serialGetchar(uart_device);
        switch(uart_input) {
         case 'o':
        pid=fork();
        if ( pid == -1 ){
                         perror("Failed fork()");
                         exit(0);
                        }
        if ( pid == 0) {
                         char * skript = "/bin/bash";
                         char * argv[] = {"/bin/bash", "/home/pi/myskript.sh", NULL};
                         char * envp[] = {NULL};
 
                         int ret;
                         ret = execve(skript, argv, envp);
 
          if (ret == -1){
                         perror("Failed  execve()");
                         exit(1);
                      } };
        break;
 
       case 'q':
       serialPuts(uart_device,"Program was ended");
       kill (pid, SIGTERM);
       trigger=0;
       break;
 
       case 'p':
       serialPuts(uart_device, "Pause");
       kill (pid, SIGSTOP);
       break;
 
       case 'w':
       serialPuts(uart_device, "Pause was ended");
       kill (pid, SIGCONT);
       break;
 
                             }
 
     delay(10);
  }
 serialClose(uart_device);
 return 0;
 
}          


Это сообщение отредактировал(а) ABC123 - 4.9.2014, 13:29
PM MAIL   Вверх
bsa
Дата 4.9.2014, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Может использовать сокеты или пайпы для этого? Все-таки сигналы вещь специфическая.
PM   Вверх
ABC123
Дата 4.9.2014, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 4.9.2014

Репутация: нет
Всего: нет



Бес понятия как сокетами или пайпами  пользоваться. 

Везде написано, SIGSTOP и SIGCONT.

А может воспользоваться чем то вроде pause()? 
Только не пойму как этим пользоваться правильно. 

пишу вместо SIGSTOP pause() ничего не происходит
PM MAIL   Вверх
xvr
Дата 5.9.2014, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(ABC123 @  4.9.2014,  13:24 Найти цитируемый пост)
Запускается процесс нормально, останавливается не сразу, а ждет пока файл воспроизведется до конца.

Это нормально. Вы останавливаете bash, который исполняет ваш скрипт, но в момент воспроизведения bash и так стоит, а работает плеер, который и показывает файл. Его вы не останавливаете, так что файл доигрывает до конца.

PM MAIL   Вверх
ABC123
Дата 7.9.2014, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 4.9.2014

Репутация: нет
Всего: нет



Да c остановкой проблем больше нет. 

А вот воспрос с паузой и  продолжением  воспроизведения не могу решить вопрос. 

Это сообщение отредактировал(а) ABC123 - 7.9.2014, 14:44
PM MAIL   Вверх
bsa
Дата 9.9.2014, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



ABC123, тебе же объяснили, что сигналы надо передавать плееру, а не bash'у. Для этого тебе надо запускать плеер напрямую или в скрипте использовать exec для запуска плеера. В противном случае ты не знаешь PID плеера.
PM   Вверх
ABC123
Дата 11.9.2014, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 4.9.2014

Репутация: нет
Всего: нет



На счет запуска плеера. 

Нашел исходный код плеера.  Вместо скрипта нужно запускать код для плеера?  Через командную строку плеер запускается так  
Код

omxplayer -b имя файла
 Или лучше просто указать папку, в которой установлен плеер и запускать непосредственно плеер?

Если я посылаю команду kill (0, SIGKILL), то процесс останавливается сразу(тоесть проигрываетель тоже дальше не играет.  А вот с паузой выглядит так. Посылаю команду kill (0, SIGSTOP) вот этом случаем плеер доигрыват видео до конца, а потом только остаеавливается. Посылаю команду kill (0, SIGCONT) ничего не происходит. Тоесть эта команда просто игнорируется. Да вообще все команды игнорируются. Посылаю опять kill (0, SIGKILL) тоже ничено не происходит. 


Это сообщение отредактировал(а) ABC123 - 11.9.2014, 15:06
PM MAIL   Вверх
konshyn
Дата 24.9.2014, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Я не совсем понял, что нужно автору. Но из всего, что понял, вот, что я бы сделал.
Я бы вместо скрипта писал полноценную программу - оболочка для плеера.
Эта оболочка должна делать fork() или exec() на плеер. Тогда она будет знать pid процесса, которому отправлять сигнал.
После запуска плеера, оболочка должна просто перехватывать состояние активности плеера и нажатия клавиш пользователя, и затем отправлять сигнал плееру. 
Т.к. автор скорее всего писал плеер не сам, то ничего не могу сказать о том, какие сигналы туда посылать и что с ними делать. Но в своем плеере я бы использовал сигналы реального времени (Клац). С этими сигналами можно и отправлять данные. Данные - это были бы команды, что нужно сделать плееру.
А в самом плеере поставил бы обработчик этого сигнала (сигналов).


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0486 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.