Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Руководить процессом


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

Код

#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;
 
}          

Автор: bsa 4.9.2014, 16:59
Может использовать сокеты или пайпы для этого? Все-таки сигналы вещь специфическая.

Автор: ABC123 4.9.2014, 17:16
Бес понятия как сокетами или пайпами  пользоваться. 

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

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

пишу вместо SIGSTOP pause() ничего не происходит

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

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

Автор: ABC123 7.9.2014, 14:44
Да c остановкой проблем больше нет. 

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

Автор: bsa 9.9.2014, 11:46
ABC123, тебе же объяснили, что сигналы надо передавать плееру, а не bash'у. Для этого тебе надо запускать плеер напрямую или в скрипте использовать exec для запуска плеера. В противном случае ты не знаешь PID плеера.

Автор: ABC123 11.9.2014, 13:30
На счет запуска плеера. 

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

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

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

Автор: konshyn 24.9.2014, 16:53
Я не совсем понял, что нужно автору. Но из всего, что понял, вот, что я бы сделал.
Я бы вместо скрипта писал полноценную программу - оболочка для плеера.
Эта оболочка должна делать fork() или exec() на плеер. Тогда она будет знать pid процесса, которому отправлять сигнал.
После запуска плеера, оболочка должна просто перехватывать состояние активности плеера и нажатия клавиш пользователя, и затем отправлять сигнал плееру. 
Т.к. автор скорее всего писал плеер не сам, то ничего не могу сказать о том, какие сигналы туда посылать и что с ними делать. Но в своем плеере я бы использовал сигналы реального времени (http://www.ibm.com/developerworks/ru/library/l-signals_2/). С этими сигналами можно и отправлять данные. Данные - это были бы команды, что нужно сделать плееру.
А в самом плеере поставил бы обработчик этого сигнала (сигналов).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)