Linux中daemon()函数的使用

int daemon(int nochdir, int noclose);

参数:

nochdir:当此参数为0时,会更改创建出的danmon的执行目录为根目录,否则(非0)时保持当前执行目录不变。

noclose:当次函数为0时,会将标准输入(0),标准输出(1),标准错误(2)重定向到/dev/null,否则保持原有标准输入(0),标准输出(1),标准错误(2)不变。

 

无论noclose 是否为0,daemon函数都不会关闭之前打开的大于等于3的fd。但是如果noclose值为0,需要确保0,1,2三个fd没有用于打开其他文件。下面一段程序就有问题,

int main(void)
{
    int fd1, fd2, fd3;
    close(0);
    close(1);
    close(2);
    fd1 = open("/tmp/tmp", O_RDWR, 0);
    fd2 = open("/tmp/tmp", O_RDWR, 0);
    fd3 = open("/tmp/tmp", O_RDWR, 0);
    daemon(0, 1);
    sleep(100);
}

用户将0,1,2三个fd用于打开文件而不是标准输入(0),标准输出(1),标准错误(2),但是daemon函数依旧会将0,1,2三个fd重定向到/dev/null(可通过lsof命令查看打开文件情况),所有后面的daemon进程并不能通过0,1,2三个fd访问到文件。

在使用daemon函数的程序中,可在最初调用打开文件函数或创建socket函数前,使用如下函数,确保0,1,2三个fd不会被用于标准输出、输入、错误外的其他用途。

static inline void sanitize_fds(void)
{
    int zero;
    if ((zero = open("/dev/null", O_RDWR, 0)) < 0) return;
    while (zero < 3) zero = dup(zero);
    close(zero);
}
时间: 2024-12-02 21:29:49

Linux中daemon()函数的使用的相关文章

Linux中system函数的实现

#include <errno.h> #include <signal.h> #include <unistd.h> int system(const char *cmdstring) /* with appropriate signal handling */ { pid_t pid; int status; struct sigaction ignore, saveintr, savequit; sigset_t chldmask, savemask; if (cm

Linux中mkdir函数与Windows中_mkdir函数的区别_Linux

下面先来给大家介绍windows下_mkdir函数 复制代码 代码如下: #include<direct.h> int _mkdir( const char *dirname ); 参数: dirname是目录的路径名指针 返回值: 如果新目录的创建时间,这些功能中的每一个返回值 0. 在错误,则函数返回 – 1 linux下mkdir函数mode_t参数详解 复制代码 代码如下: #include <sys/stat.h> int mkdir(const char *path,

Linux中fork()函数实例分析_Linux

一.fork 入门知识  一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事.  一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同.相当于克隆了一个自己.  我们来看一个例子: /* * fork_test.c * version 1

linux中时间函数

linux下常用时间类型有四种: time_t . struct   tm. struct  timeval .    struct   timespec 1.time_t   时间函数 time_t  类型在time.h中定义: #ifndef   __TIME__T #define  __TIME_T typedef    long  time_t #endif 可见, time_t 实际上是一个长整型,其值表示从1970年1月1日00时00分00秒(linux系统的Epoch时间)到当前时

Linux中getopt函数用法

  最近做cache lab 用到了getopt函数, 用man 3 getopt查看了下用法, 做个总结. 描述:getopt函数是用来解析命令行参数的, 以'-'或'--'开头的参数为选项元素,除去'-'或'--'的选项元素 为选项字符.如果getopt函数被重复调用,则它将会依次返回每个选项元素中的选项字符. 使用getopt函数需要包含以下头文件: #include #include 有几个全局变量与getopt函数解析参数有关: optind: int型, 指示下一个要解析的参数位置,

sprintf,snprintf的用法(可以作为linux中itoa函数的补充)【转】

转自:http://blog.csdn.net/educast/article/details/25068445 函数功能:把格式化的数据写入某个字符串 头文件:stdio.h 函数原型:int sprintf( char *buffer, const char *format [, argument] - ); 返回值:字符串长度(strlen)     MSDN中的例子如下 #include <stdio.h> void main( void ){char buffer[200], s[]

linux中mail函数不能发送邮件怎么办

没有安装或启动 sendmail 组件 1.重新安装 sendmail 组件,我用的是 CentOS ,使用下面的命令安装 yum install sendmail 2.使用下面的命令重启php-fpm进程 /etc/init.d/php-fpm restart 3.检测sendmail是否运行正常 /etc/init.d/sendmail status 如果显示正在运行running 就可以. 可能用到的命令 /etc/init.d/sendmail start (启动sendmail) /e

linux中mail函数不能发送邮件

没有安装或启动 sendmail 组件 解决办法 我是新手,命令不熟,所以写的很详细,老鸟勿喷哦 1.重新安装 sendmail 组件,我用的是 CentOS ,使用下面的命令安装  代码如下 复制代码  yum install sendmail 2.使用下面的命令重启php-fpm进程    代码如下 复制代码  /etc/init.d/php-fpm restart 3.检测sendmail是否运行正常    代码如下 复制代码  /etc/init.d/sendmail status 如果

Linux Shell学习:如何调用Shell中的函数

说起函数调用,相信大家也不会陌生,然而对于初学Shell的我来说,Shell中函数调用方式却有点让我不太习惯,自己也走了不少的弯路,因为传递参数时出了一个很"自然"的错误,也让我吃了不少的苦头,所以总结一下Shell中函数的调用方法. 一.Shell中函数的定义 为了方便程序和管理和模块化并减少代码的重复,函数的确是一个好东西.而Shell中函数的定义有两种方法,如下: function fname() { statements: } 或 fname() { statements; }