В настоящее время я запускаю исполняемый файл на своем мобильном телефоне, используя оболочку adb (для двоичного файла требуются разрешения пользователя «shell»).
Я хочу, чтобы процесс продолжался в фоновом режиме как можно дольше, но процесс прекращается каждый раз, когда я отсоединяю USB-шнур.
ОС тестирующего устройства является неофициальной версией LineageOS / Android 8.1.
Я пробовал:
- запуск исполняемого файла со всеми комбинациями «nohup» и «> / dev / null 2> / dev / null </ dev / null &» </li>
- для перехвата и обработки каждого возможного сигнала в самом исполняемом файле
- чтобы отключить процесс как демон
- все вышеперечисленное в совокупности
Мой текущий код следующий, скомпилированный в стандартный NDK-проект с конфигурацией CMake «add_executable (libDaemonize.so Daemonize.c)» и выполненный в оболочке adb с
"nohup /data/app/org.app.name/lib/arm/libDaemonize.so> / dev / null 2> / dev / null </ dev / null &".
Имя "lib ***. So" необходимо для автоматической упаковки двоичного файла в apk и установки его на устройство с исполняемыми разрешениями. </p>
/*Based on https://stackoverflow.com/a/17955149/11250128*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <syslog.h>
void INThandler(int);
static void skeleton_daemon()
{
pid_t pid;
/* Fork off the parent process */
pid = fork();
/* An error occurred */
if (pid < 0)
exit(EXIT_FAILURE);
/* Success: Let the parent terminate */
if (pid > 0) {
syslog (LOG_NOTICE, "From starter: PID: %d, PPID: %d\n", getpid(), getppid());
exit(EXIT_SUCCESS);
}
/* On success: The child process becomes session leader */
if (setsid() < 0)
exit(EXIT_FAILURE);
/* Catch, ignore and handle ALL signals */
int i;
for(i=1; i<32; i++) {
signal(i, INThandler);
}
/* Fork off for the second time*/
pid = fork();
/* An error occurred */
if (pid < 0)
exit(EXIT_FAILURE);
/* Success: Let the parent terminate */
if (pid > 0)
exit(EXIT_SUCCESS);
/* Set new file permissions */
umask(0);
/* Change the working directory to the root directory */
/* or another appropriated directory */
chdir("/");
/* Close all open file descriptors */
int x;
for (x = sysconf(_SC_OPEN_MAX); x>=0; x--)
{
close (x);
}
/* Open the log file */
openlog ("testdaemon", LOG_PID, LOG_DAEMON);
}
int main()
{
skeleton_daemon();
while (1)
{
syslog (LOG_NOTICE, "Daemon running. PID: %d, PPID: %d\n", getpid(), getppid());
sleep (1);
}
syslog (LOG_NOTICE, "Daemon terminated.");
closelog();
return EXIT_SUCCESS;
}
/*Define signal handlers to find out what signal kills us */
void INThandler(int sig)
{
syslog(LOG_CRIT, "Daemon received Signal %d", sig);
}
Все вызовы выполняются успешно и работают как положено (например, демон, принимающий init / pid 1 в качестве родителя), но как только кабель USB отключается, приложение прекращает печать в системный журнал.
Мое предположение заключается в том, что система Android активно убивает процесс, но ни журналы Adbd (активированные через «setprop persist.adb.trace_mask»), ни после поиска в источнике Adb я не нашел никаких доказательств этого.
Я чувствую, что скучаю по чему-то очевидному.
Спасибо за ваши идеи.