热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Unix守护进程的创建示例

《Unix环境高级编程》初始化一个守护进程的调用,cmd可为守护进程名。  




《Unix环境高级编程》初始化一个守护进程的调用,cmd可为守护进程名。


 


void

daemonize(

const


char

*cmd)
{


int

i, fd0, fd1, fd2;
pid_t pid;


struct

rlimit r1;


struct

sigaction sa;


/* 设置文件模式创建屏蔽字为0,因为继承得来的文件模式创建屏蔽字可能会拒绝设置某些权限。 */
umask(0);

/* 获取最大文件描述符。 */


if

(getrlimit(RLIMIT_NOFILE, &r1) <0) {
err_sys("

%s: In demonize(), can't get file limit

", cmd);
}

/*

* 父进程退出,第一个子进程继承了父进程的进程组ID,但该子进程有新的进程ID,

* 这就保证了该子进程不是进程组的组长进程。为setsid准备了条件(调用setsid的进程

* 不能是进程组的组长进程)。

*/


if

((pid = fork()) <0) {
err_sys("

%s: In demonize(), can't fork

", cmd);
}

else


if

(pid != 0) {


exit

(0);
}


/*

* 创建新会话,使第一个子进程即当前进程(因为父进程已退出)成为新会话的首进程。

* 也使第一个子进程成为新进程组的组长进程,

没有控制终端



*/
setsid();

/*

* 确保将来的操作不分配终端(主要针对UNIX系统V派生的系统,当会话首进程打开

* 第一个尚未与上一个会话相关联的终端设备时,UNIX系统V派生的系统会将此作为控制

* 终端分配给此会话。这假定会话首进程在调用open时没指定O_NOCTTY标志。)

*/
sa.sa_handler = SIG_IGN;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;


if

(sigaction(SIGHUP, &sa, NULL) <0) {
err_sys("

%s:In demonize(), can't ignore SIGHUP

");
}


if

((pid = fork()) <0) {
err_sys("

%s:In demonize(), sencond can't fork

", cmd);
}

else


if

(pid != 0) {


exit

(0);
}

/* 改变工作目录为根目录 */


if

(chdir("

/

") <0) {
err_sys("

%s:In demonize(), can't change directory to /

", cmd)
}

/* 关闭所有打开的文件描述符 */


if

(r1.rlim_max == RLIM_INFINITY) {
r1.rlim_max = 1024;
}


for

(i = 0; i

close

(i);
}

/* 0 1 2描述符指向/dev/null */
fd0 =

open

("

/dev/null

", O_RDWR);
fd1 = dup(0);
fd2 = dup(1);

/* 初始化系统日志 */
openlog(cmd, LOG_CONS, LOG_DAEMON);


if

(fd0 != 0 || fd1 != 1 || fd2 != 2) {
syslog(LOG_ERR, "

unexpected file descriptiors %d %d %d

", fd0, fd1, fd2);


exit

(1);
}
}


Unix守护进程的创建示例




推荐阅读
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文介绍了在RHEL 7中的系统日志管理和网络管理。系统日志管理包括rsyslog和systemd-journal两种日志服务,分别介绍了它们的特点、配置文件和日志查询方式。网络管理主要介绍了使用nmcli命令查看和配置网络接口的方法,包括查看网卡信息、添加、修改和删除配置文件等操作。 ... [详细]
  • 【重识云原生】第四章云网络4.8.3.2节——Open vSwitch工作原理详解
    2OpenvSwitch架构2.1OVS整体架构ovs-vswitchd:守护程序,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换flow-basedswitchin ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • Linux目录结构说明(2)一些重要文件目录1.一些重要文件目录参考1.一些重要文件目录1.网卡配置文件etcsysconfignetwork-scr ... [详细]
  • 在做以下实验时需先做的操作为:(1)打开两个虚拟机(desktop和server)并更改他们的ipÿ ... [详细]
author-avatar
mobiledu2502891487
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有