免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3570 | 回复: 6

Linux下,如何使程序实现后台运行 [复制链接]

论坛徽章:
0
发表于 2011-01-16 20:36 |显示全部楼层
Linux下 现有一个 test.c程序,
#include<stdio.h>

void server()//服务
{
  ...
}


int main(int argc,char **argv)
{
  ...
  server();
  return 1;
}
编译连接后,生成test文件,当从外部接收到某个参数(-n)后,就让test在后台执行,效果和使用nohup命令一样,如何在程序中实现。
在网上看到使用守护进程daemon,但是对这个概念还是比较模糊的,希望有个详细的例子来说明。

论坛徽章:
0
发表于 2011-01-17 08:59 |显示全部楼层
各位帮忙

论坛徽章:
0
发表于 2011-01-17 23:45 |显示全部楼层
APUE的13.3节将的很详细,连代码都有。

论坛徽章:
0
发表于 2011-01-18 11:13 |显示全部楼层
回复 1# hanwangabc


    本文引自:http://bbs.chinaunix.net/thread-1308778-1-1.html,另外你可以参考楼上给你的建议(APUE Chapter 13)
  1. #include <stdio.h>
  2.     #include <stdlib.h>
  3.     #include <ctype.h>
  4.     #include <unistd.h>
  5.     #include <fcntl.h>
  6.     #include <signal.h>
  7.     #include <sys/wait.h>

  8.     /* Global variables */
  9.     ...
  10.     volatile sig_atomic_t keep_going = 1; /* controls program termination */


  11.     /* Function prototypes: */
  12.     ...
  13.     void termination_handler (int signum); /* clean up before termination */


  14.     int
  15.     main (void)
  16.     {
  17.       ...

  18.       if (chdir (HOME_DIR))         /* change to directory containing data
  19.                                         files */
  20.        {
  21.          fprintf (stderr, "`%s': ", HOME_DIR);
  22.          perror (NULL);
  23.          exit (1);
  24.        }

  25.        /* Become a daemon: */
  26.        switch (fork ())
  27.          {
  28.          case -1:                    /* can't fork */
  29.            perror ("fork()");
  30.            exit (3);
  31.          case 0:                     /* child, process becomes a daemon: */
  32.            close (STDIN_FILENO);
  33.            close (STDOUT_FILENO);
  34.            close (STDERR_FILENO);
  35.            if (setsid () == -1)      /* request a new session (job control) */
  36.              {
  37.                exit (4);
  38.              }
  39.            break;
  40.          default:                    /* parent returns to calling process: */
  41.            return 0;
  42.          }

  43.        /* Establish signal handler to clean up before termination: */
  44.        if (signal (SIGTERM, termination_handler) == SIG_IGN)
  45.          signal (SIGTERM, SIG_IGN);
  46.        signal (SIGINT, SIG_IGN);
  47.        signal (SIGHUP, SIG_IGN);

  48.        /* Main program loop */
  49.        while (keep_going)
  50.          {
  51.            ...
  52.          }
  53.        return 0;
  54.     }

  55.     void
  56.     termination_handler (int signum)
  57.     {
  58.       keep_going = 0;
  59.       signal (signum, termination_handler);
  60.     }
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2011-01-21 14:57 |显示全部楼层
儿子进程杀死父亲进程就 OK 了。

论坛徽章:
0
发表于 2011-01-22 10:22 |显示全部楼层
有个系统调用

int daemon(int nochdir, int noclose);

       The  daemon() function is for programs wishing to detach themselves from the controlling terminal and run in the back‐\r
       ground as system daemons.

       If nochdir is zero, daemon() changes the process's current working directory to the root directory ("/"); otherwise,

       If noclose is zero, daemon() redirects standard input, standard output and standard error to /dev/null; otherwise,  no
       changes are made to these file descriptors.

论坛徽章:
0
发表于 2011-01-22 10:23 |显示全部楼层
daemon是库函数,不是系统调用
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP