Я изучаю 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 сейчас.Поскольку он НИЧЕГО не делает, я знаю, что он меняет дескриптор по умолчанию, но я не понимаю, почему он не вызывает функцию обработки.Может ли кто-нибудь помочь мне сделать это?