中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
unix编程的部分抄录
作者:未知 时间:2005-09-13 23:27 出处:Blog.ChinaUnix.net 责编:chinaitpower
              摘要:unix编程的部分抄录
有些有答案,有些没有,自己的笔记

为何在一个fork的子进程分支中使用_exit函数而不使用exit函数?

好像目前用到的程序都是用exit()在子进程中返回,怎样才能测试差别

exit()清理两次,_exit()清理一次

我怎样睡眠小于一秒?
usleep(unsigned long usec);
setitimer()
getitimer()

fork()两次成为孤儿进程,初始进程init负责清理孤儿进程

我怎样使我的程序作为守护程序运行?
    if(fork()) exit(1);
    setsid();
    signal(SIGHUP,SIG_IGN);
    chdir("/");
    umask(0);
    for(i=0;i<64;i++)
        close(i);
       
这里是成为守护程序的步骤:

调用‘fork()’以便父进程可以退出,这样就将控制权归还给运行你程序的 命令行或shell程序。需要这一步以便保证新
进程不是一个进程组头领进程(process group leader)。下一步,‘setsid()’,会因为你是进程组头领进程而失败。

调用‘setsid()’ 以便成为一个进程组和会话组的头领进程。由于一个控制终端 与一个会话相关联,而且这个新会话还没
有获得一个控制终端,我们的进程没 有控制终端,这对于守护程序来说是一件好事。

再次调用‘fork()’所以父进程(会话组头领进程)可以退出。这意味着我们,一 个非会话组头领进程永远不能重新获得控制终端。

调用‘chdir("/")’确认我们的进程不保持任何目录于使用状态。不做这个会导 致系统管理员不能卸装(umount)一个文件系统,因
为它是我们的当前工作目录。 [类似的,我们可以改变当前目录至对于守护程序运行重要的文件所在目录]

调用‘umask(0)’以便我们拥有对于我们写的任何东西的完全控制。我们不知 道我们继承了什么样的umask。 [这一步是可选的](
译者注:这里指步骤5,因为守护程序不一定需要写文件)

调用‘close()’关闭文件描述符0,1和2。这样我们释放了从父进程继承的标 准输入,标准输出,和标准错误输出。我们没办法知
道这些文描述符符可能 已经被重定向去哪里。注意到许多守护程序使用‘sysconf()’来确认 ‘_SC_OPEN_MAX’的限制。‘_SC_OPEN_MAX’
告诉你每个进程能够打 开的最多文件数。然后使用一个循环,守护程序可以关闭所有可能的文件描 述符。你必须决定你需要做这个
或不做。如果你认为有可能有打开的文件描 述符,你需要关闭它们,因为系统有一个同时打开文件数的限制。

为标准输入,标准输出和标准错误输出建立新的文件描述符。即使你不打算 使用它们,打开着它们不失为一个好主意。准确操作这些描
述符是基于各自 爱好;比如说,如果你有一个日志文件,你可能希望把它作为标准输出和标 准错误输出打开,而把‘/dev/null’作为标
准输入打开;作为替代方法,你可 以将‘/dev/console’作为标准错误输出和/或标准输出打开,而‘/dev/null’作 为标准输入,或者任何
其它对你的守护程序有意义的结合方法。(译者注:一 般使用dup2函数原子化关闭和复制文件描述符,参见《高级编程》3.12节)

如果你的守护程序是被‘inetd’启动的,几乎所有这些步骤都不需要(或不建议采用)。在那种情况下,标准输入,标准输出和标准错误输
出都为你指定为网络连接,而且‘fork()’的调用和会话的操纵不应做(以免使‘inetd’造成混乱)。只有‘chdir()’和‘umask()’这两步保持有用。

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有