产生一个守护进程函数和信号处理程序

时间:2014-02-26 23:49:28

标签: c daemon

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

/* 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;

2 个答案:

答案 0 :(得分:0)

fprintf()到一个文件真的很简单 以下示例来自http://www.cplusplus.com/reference/cstdio/fprintf/

您需要可以在主FILE * 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;
}

答案 1 :(得分:0)

首先,您不需要将所有信号和守护程序调用放在循环中。注册信号是一次性过程,因此每当您收到信号时,您的相应信号处理程序将被调用。另一件事,我不确定为什么当你试图做'fprintf(fp,“%s”,信号)时你没有收到警告;' 您可以使用全局变量在信号处理程序中设置它并使用它在日志中写入值。

所以你的主要应该像:

  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,请使用守护进程(1,1)