Как запустить «gdbserver» в фоновом режиме?

Я общаюсь с устройством через последовательный порт, и для запуска «gdbserver» (например, gdbserver :2345 myapp ) он полностью блокирует терминал. Ни амперсанд, ни символ, ни комбинация ^ z не могли отправить его на задний план. Также я только что проверил: «gdbserver» ведет себя так же и на Kubuntu.

Мне действительно нужно использовать команды оболочки, и, поскольку я понятия не имею, как их выполнять с помощью «gdbserver», после запуска я чувствую себя калекой.

  • Почему фоновые процессы иногда останавливаются спонтанно?
  • Как запустить длинный grep, вывести результат на меньшее и поместить все на задний план?
  • Запустите фоновый процесс из сценария и управляйте им, когда скрипт заканчивается
  • Выполнение фона параллельно
  • В чем разница между запуском «command &» и «command -D»
  • Невозможно создать фоновый процесс
  • Linux останавливает фоновый процесс с помощью kill + PID
  • Как узнать, закончилась ли фоновая работа?
  • 2 Solutions collect form web for “Как запустить «gdbserver» в фоновом режиме?”

    Кажется, это сработало для ОП.

     gdbserver :2345 ls > /dev/null 2>&1 & 

    Я думаю, причина в том, что, когда программа демонизирована, она закрывает все STDIO 0,1 и 2. Следующий IO для открытия будет равен 0. Если программа пытается использовать 0,1 или 2 с такими вещами, как printf или scanf он будет действовать на неправильный IO или закрытый IO. Например, если он демонзирован, сокет открывается на 0, был STDIN, и если вызывается printf, он будет записывать в не открытый FD, что может привести к сбою программы.

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

    —– daemonize.c

     #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <errno.h> #include <unistd.h> #include <syslog.h> #include <string.h> int main(int argc, char *argv[]) { int i; // int reterr; pid_t pid, sid; //Fork the Parent Process pid = fork(); if (pid < 0) { exit(EXIT_FAILURE); } //We got a good pid, Close the Parent Process if (pid > 0) { exit(EXIT_SUCCESS); } //Change File Mask umask(0); //Create a new Signature Id for our child sid = setsid(); if (sid < 0) { exit(EXIT_FAILURE); } //Change Directory //If we cant find the directory we exit with failure. if ((chdir("/")) < 0) { exit(EXIT_FAILURE); } //Close Standard File Descriptors close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); //---------------- //Main Process //---------------- for(i=0; i < argc - 1; i++) { argv[i]=argv[i+1]; } argv[argc-1] = '\0'; execv(argv[0], argv); //reterr = execv(argv[0], argv); //printf("execv failed with '%s'\n", strerror(errno)); //Close the log closelog (); } 

    — Makefile

     CXX = gcc # Implicit rules needed to build .o files and Metaobject stuff (_m.o) .SUFFIXES: .c .o .h .co: $(CXX) -c $(XTRA_INCL) $< -o $@ OBJECTS = daemonize.o daemonize: $(OBJECTS) $(CXX) -o $@ -pipe -O2 $(OBJECTS) $(RPATH_XT) strip --strip-unneeded $@ clean: @rm -f core *.o *_m.* *.bak *.elf 
    Linux и Unix - лучшая ОС в мире.