Обратный вызов в код приложения Java Android из JNI после перехвата сигнала (SIGSEGV) в собственном коде

Используйте ниже код: -

$result = [];
foreach($MainArray as $record){
 $result[$record['Machine_Name']][] = $record;
}

echo '<pre>'; print_r($result);

вывод: -

Array
(
    [Machine1] => Array
        (
            [0] => Array
               (
                  [Job_Name] => WXYZ
                  [Quantity] => 1000
                  [Start_Date] => 2014-07-30 00:00:00
                  [Completion_Date] => 2014-08-02 00:00:00
                  [Labor] => 4
               )
            [1] => Array
               (
                  [Job_Name] => BCDA
                  [Quantity] => 1200
                  [Start_Date] => 2014-08-02 00:00:00
                  [Completion_Date] => 2014-08-07 00:00:00
                  [Labor] => 1
               )
         )
      [Machine2] => Array
        (
            [0] => Array
               (
                  [Job_Name] => ABCD
                  [Quantity] => 1500
                  [Machine_Name] => Machine2
                  [Start_Date] => 2014-08-08 00:00:00
                  [Completion_Date] => 2014-08-14 00:00:00
                  [Labor] => 2
               )
         )   
)
4
задан Kevin Kreiser 15 January 2019 в 17:21
поделиться

1 ответ

@ Комментарий Эндрю Хенле был правильным ответом:

Да, вы делаете что-то не так: вы вызываете неопределенное поведение, вызывая не асинхронно безопасные для сигнала функции из сигнала. обработчик. В отсутствие конкретной документации, поддерживающей вызов функции, такой как список асинхронно-безопасных функций POSIX, вы действительно не можете делать какие-либо вызовы из обработчика сигнала. В сноске 188 стандарта C даже говорится: «Таким образом, обработчик сигнала в общем случае не может вызывать функции стандартной библиотеки». POSIX предоставляет список функций, которые безопасно вызывать - в POSIX. Все остальное - неопределенное поведение.

Ранее он дал более подробный ответ на этот вопрос здесь: https://stackoverflow.com/a/34553070/5251867

РЕДАКТИРОВАТЬ:

[ 1114] Рассматривая доступные функции, кажется, что есть два пути, которыми можно следовать.

  1. используют open, write, close, чтобы удалить файл с соответствующей информацией о сигнале, который был пойман, и обработать этот файл позже (при перезапуске приложения или из другой службы, которая контролирует это). файл изменений)
  2. используют connect, bind, send для отправки подробностей через сокет в какой-то другой процесс

Я думаю, что оба они технически IPC, поскольку оба являются средством, позволяющим другому процессу получить доступ к информации, которую там размещает обработчик сигналов. Передача этой информации другому процессу, где вы можете что-то сделать с этой информацией, кажется единственным подходящим способом продвинуться вперед.

0
ответ дан Kevin Kreiser 15 January 2019 в 17:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: