C 生成守护进程函数和信号处理程序

C 生成守护进程函数和信号处理程序,c,daemon,C,Daemon,我想生成一个守护进程,应用信号处理程序,并将它们记录到一个文件中。我无法在文件中记录信号处理程序。此外,我不确定这些信号处理程序是否正常工作。。。。如何检查它们。请帮忙 /* A signal handler */ void signal_handler(int signal) { printf("Caught signal %d\t", signal); if (signal == SIGINT) printf("Interrupt (Ctrl-C)"); e

我想生成一个守护进程,应用信号处理程序,并将它们记录到一个文件中。我无法在文件中记录信号处理程序。此外,我不确定这些信号处理程序是否正常工作。。。。如何检查它们。请帮忙

/* A signal handler */

void signal_handler(int signal)
{
    printf("Caught signal %d\t", signal);
    if (signal == SIGINT)
    printf("Interrupt (Ctrl-C)");
    else if (signal == SIGQUIT)
    {
    printf("QUIT");
    exit(0);
    }
    else if (signal == SIGABRT)
    {
    printf("Process Aborted");
    exit(0);
    }
    else if (signal == SIGTRAP)
    printf("Trace/breakpoint trap");
    else if (signal == SIGKILL)
    {
    printf("Kill");
    exit(0);
    }
    else if (signal == SIGTERM)
    printf("Termination");
    else if (signal == SIGCONT)
    printf("Continue if stopped");
    else if (signal == SIGTSTP)
    printf("Pause the execution");
    printf("\n");
}

Here is the main function

FILE *fp= NULL; 
fp = fopen ("Log.txt", "w+");
do
{
    daemon(1, 1);// fork to a background daemon process 
    //printf("daemon is not working");
    printf("daemon-ed \n ");
    /* Registering signal handlers */
    signal(SIGINT, signal_handler);
    signal(SIGQUIT, signal_handler); // Set signal_handler() as the
    signal(SIGABRT, signal_handler); // signal handler for these
    signal(SIGTRAP, signal_handler); // signals.
    signal(SIGKILL, signal_handler);
    signal(SIGTERM, signal_handler);
    signal(SIGCONT, signal_handler);
    signal(SIGTSTP, signal_handler);

    fprintf(fp, "%s", signal);
    fflush(fp);
    // Implement and call some function that does core work for this daemon.

    fclose(fp);
}while(-1);


 return 0;
文件的fprintf()非常简单 下面的示例来自

您需要文件指针,例如,您可以在主文件*pFile中声明该指针

然后使用fopen给出pFile值

之后,您可以使用fprintf写入文件

/* fprintf example */
#include <stdio.h>

int main ()
{
   FILE * pFile;
   int n;
   char name [100];

   pFile = fopen ("myfile.txt","w");
   for (n=0 ; n<3 ; n++)
   {
     puts ("please, enter a name: ");
     gets (name);
     fprintf (pFile, "Name %d [%-10.10s]\n",n,name);
   }
   fclose (pFile);

   return 0;
}
/*fprintf示例*/
#包括
int main()
{
文件*pFile;
int n;
字符名[100];
pFile=fopen(“myfile.txt”,“w”);

对于(n=0;n首先,您不需要将所有信号和守护进程调用放入循环中。注册信号是一次性的过程,因此每当您收到信号时,都会调用相应的信号处理程序。另一件事,我不确定您在尝试执行'fprintf(fp,“%s”,signal);' 您可以使用全局变量在信号处理程序中设置它,并使用它在日志中写入值

因此,您的主视图应该类似于:

  int glb_sig; //Set its value in the signal handler
  main() {
  FILE *fp= NULL; 
  fp = fopen ("Log.txt", "w+");
  daemon(1, 0);// fork to a background daemon process
  printf("daemon-ed \n ");
  /* Registering signal handlers */
  signal(SIGINT, signal_handler);
  ...
  while(1) {

  }

注意:如果要查看printfs,请使用daemon(1,1)

不要在信号处理程序中使用printf。它不是信号安全的。句点。可能daemon()正在将stdout连接到>/dev/null。请尝试使用fprintf()它不是信号安全的,等等。但如果信号处理程序正在工作,至少你会看到一些日志。要测试它们,请使用kill命令。另一件事:SIGKILL无法处理,所以不要麻烦。这就是我遇到问题的地方,我不知道如何将fprintf()转换为文件我如何使用frpintf()在这里,我不接受任何输入..我无法在这里应用:(这只是一个如何打印到文件的示例。你可以让程序生成文件并跟踪位置。在任何情况下,你都可以执行类似fprintf(日志文件,“记录此信息”)的操作);它的工作原理有点像printf。使用fprintf不需要输入