Дескриптор прерывания не вызывается после добавления с помощью g_unix_signal_add - PullRequest
0 голосов
/ 16 мая 2018

Я изучаю gstreamer, и у меня есть простая программа, в которой я хочу аккуратно завершить поток после нажатия CTRL + C в Linux.Для этого я прочитал исходный код gst-launch и увидел, что g_unix_signal_add () используется для добавления сигналов.В своем коде я добавил строку:

signal_watch_intr_id = g_unix_signal_add (SIGINT,
                       (GSourceFunc) intr_handler, data.pipeline);

, где data - это структура, содержащая конвейер.Моя функция обработки:

static gboolean
intr_handler (gpointer user_data)
{
  printf("handling interrupt.\n");
  GstElement *pipeline = (GstElement *) user_data;


  /* post an application specific message */
  gst_element_post_message (GST_ELEMENT (pipeline),
      gst_message_new_application (GST_OBJECT (pipeline),
          gst_structure_new ("GstLaunchInterrupt",
              "message", G_TYPE_STRING, "Pipeline interrupted", NULL)));

  /* remove signal handler */
  signal_watch_intr_id = 0;
  return G_SOURCE_REMOVE;
}

Я ожидаю, что она напечатает «Обработка прерывания».на консоль заставьте конвейер отправить сообщение типа GST_MESSAGE_APPLICATION, которое затем будет обработано для остановки конвейера.Тем не менее, приложение просто ничего не делает после SIGINT сейчас.Поскольку он НИЧЕГО не делает, я знаю, что он меняет дескриптор по умолчанию, но я не понимаю, почему он не вызывает функцию обработки.Может ли кто-нибудь помочь мне сделать это?

1 Ответ

0 голосов
/ 17 мая 2018

Как отметили комментарии Филиппа, проблема заключалась в том, что я не запускал основной цикл и не использовал gst_bus_timed_pop () для получения сообщений от шины.Используя GMainLoop и добавив наблюдатель шины (используя gst_bus_add_watch) с функцией обратного вызова шины, мне удалось перехватить прерывание, как я хотел.

...