【问题标题】:How to make c programe as daemon in ubuntu?如何在ubuntu中将c程序作为守护进程?
【发布时间】:2017-12-17 09:03:37
【问题描述】:

您好,我是 linux 环境的新手。我正在尝试创建守护进程。

#include<stdio.h>
int  main()
{
int a=10,b=10,c;
c=sum(a,b);
printf("%d",c);
return (0);
}
int sum(int a,int b)
{
return a+b;
}

我想创建它的守护进程。我可以知道怎么做吗?任何帮助,将不胜感激。谢谢。

【问题讨论】:

  • 相信你并不完全明白什么是作业控制,什么是守护进程。

标签: c ubuntu daemon


【解决方案1】:

守护程序通常不使用其标准输入和输出流,因此不清楚您的程序如何作为守护程序运行。而且守护程序通常没有任何终端,因此它不能使用clrscr。另请阅读tty demystified 页面和daemon(7)

我建议阅读一些关于 Linux 编程的好介绍,例如可免费下载的旧版 ALP(或更新的东西)。我们无法在这里解释所有内容,您需要阅读整本书。另见intro(2)syscalls(2)

我还建议阅读有关操作系统的更多信息,例如免费提供的Operating Systems: Three Easy Pieces 教科书。

您可以在 C 程序中使用 daemon(3) 函数将其作为守护程序运行(但是,您可能没有任何输入和输出)。您可能希望使用syslog(3) 记录消息。

您可以考虑使用您的 shell 的 job control 设施。您可以在后台运行您的程序(例如,在交互式 shell 中键入 myprog myarg &amp;)。您可以使用batch 命令。然而,后台进程和批处理作业在技术上都不是守护进程。

也许您想编写一些ONC-RPCJSONRPCWeb API 服务器和客户端。你会找到相关的库。另见pipe(7)socket(7)

(需要几天或几周才能阅读更多内容)

【讨论】:

  • 好吧抱歉让我们说如果我有硬编码值而不是感谢从键盘获取。在这种情况下,我怎样才能使它成为守护进程
  • 正如我所写,您可以使用daemon 函数
【解决方案2】:

首先找到daemon process 的属性是什么,据我所知,守护进程具有这些属性:

  • 应该notany parent(它本身应该是父级)
    进程本身是session leader
  • 环境更改为root
  • 创建mask的文件模式应该是zero
  • 没有控制终端。
  • 所有终端应为removed
  • 不应该是un-mounted

通过考虑上述属性来实现代码

int i=0;
int main()
{
        int pid;
        pid=fork();
        if(pid!=0) {
         /** you can add your task here , whatever you want to run in background **/
                exit(0);
        }
        else
        {
                setsid();//setting sessions
                chdir("/");//root.. should'nt beunmounted
                umask(0);
                close(0);//all terminal are removed
                close(1);
                close(2);
                while(1)
                {
                        printf("i = %d \n",i);
                        i++;
                }
        }
        return 0;
}

或者你可以通过daemon()的手册页

 int daemon(int nochdir, int noclose);

希望对你有帮助。

【讨论】:

  • 谢谢。在上面的c程序中不需要添加头文件吗?
  • RTFM:daemon(3)fork(2) man 页面详细说明了所需的标题。
  • 是的,当然你需要添加头文件。打开每个系统调用的手册页,你会得到标题。
  • 另外,将上述程序作为守护进程后,我可以在 c# 程序中使用这个守护进程吗?
  • C 和 C# 是完全不同的编程语言(同样 C++ 与 C 不同)。请选择您要编写的编程语言。
【解决方案3】:

我不会编写代码来使 C 程序成为守护进程,而是使用已经成熟的工具,例如 supervisor:

http://supervisord.org/

【讨论】:

    【解决方案4】:

    我认为下面的方法会起作用

    screen cmd arg1 arg2
    

    你也可以试试

    nohup cmd arg1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 2011-07-21
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      • 2013-09-14
      • 2023-03-02
      相关资源
      最近更新 更多