Shell

如何在後台啟動«gdbserver»?

  • April 29, 2020

*當我在設備(如gdbserver :2345 myapp)*上執行 gdbserver 時,gdbserver 完全阻塞了終端。既不添加和&號,也不按^z使其在後台執行。我還檢查了:它也可以在 Kubuntu 上重現。

我真的需要使用 shell 命令,而且由於我不知道如何通過 gdbserver 執行這些命令,所以在它執行後我覺得自己癱瘓了。

這似乎對 OP 有效。

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

我認為這是因為當程序被守護程序時,它會關閉所有 STDIO 0,1 和 2。下一個要打開的 IO 將是 0。如果程序嘗試將 0,1 或 2 與 printf 或 scanf 之類的東西一起使用它將作用於錯誤的 IO 或關閉的 IO。例如,如果它是守護程序化的,則在 0 上打開的套接字是 STDIN,如果呼叫 printf,它將寫入非打開的 FD,這將導致程序崩潰。

我從來沒有找到真正用 shell 分叉的方法,有太多的原因可以讓某些東西保持連接。我編寫了一個非常小的 C 程序來完全分叉你在它之後執行的任何命令。

—– 守護程序.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 ();
}

— 生成文件

CXX = gcc

# Implicit rules needed to build .o files and Metaobject stuff (_m.o)
.SUFFIXES: .c .o .h

.c.o:
   $(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

引用自:https://unix.stackexchange.com/questions/166116