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

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

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

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 
  • как получить код выхода из таймаута во время выполнения команды в фоновом режиме?
  • Как сохранить подсказку в фоновом режиме?
  • Функция Shell, чтобы проверить, есть ли приостановленный процесс, являющийся дочерним элементом этой оболочки?
  • Как не создать файл nohup.out, но сохранить вывод терминала?
  • Сценарий оболочки ждет команды фона
  • Странная проблема с ловушкой и SIGINT
  • Как завершить фоновый процесс?
  • «. ~ / .bashrc "не устанавливает переменные, как ожидалось, в вызывающем скрипте
  • Linux останавливает фоновый процесс с помощью kill + PID
  • Как sh -e взаимодействует с &?
  • Как узнать, закончилась ли фоновая работа?
  • Linux и Unix - лучшая ОС в мире.