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

创建三个并发进程linux,Linux多进程开发(三)进程创建之守护进程的学习

之前发过一篇守护进程的文章,但是解析的不够详细,这次,详细来解释守护进程的一些概念和特性。概念:后台运行、没有控制端与之相连

之前发过一篇守护进程的文章,但是解析的不够详细,这次,详细来解释守护进程的一些概念和特性。

概念:

后台运行、没有控制端与之相连的进程。独立于控制终端,通常周期性的执行某种任务。

Why survival:

Linux的大多数服务器是用守护进程的方式实现,例如:Internet服务器的inted,Web服务器的http等。Linux守护进程类似Windowns的系统服务。

daemon特性:

1.让进程在后台执行,方法是fork产生一个子进程,然后父进程退出。

2.调用setsid创建一个新对话期。

控制端、登录会话和进程组通常是从父进程继承来的。

守护进程要摆脱它们,不受它们的影响,其方法是调用setid使进程成长为一个会话组长。

注:当进程是会话组长时,调用setid会失败,但第一点已经保证进程不是会话组长。

setid调用成功后,进程成为新的会话组长和进程组长,并与原来的登陆会话和进程组脱离,由于会话过程对控制终端的独占性,进程同时与控制终端脱离。

3.禁止进程重新打开控制终端。

以上完成后,进程已经成为一个无终端的会话组长,但是它可以重新申请打开一个终端,为了避免这种情况的发生,可以通过使进程不再是会话组长来实现,再一次fork创建新的进程,使调用fork的进程退出。

4.关闭不再需要的文件描述符。

创建的新子进程从父进程继承打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在的文件系统无法卸下以及引起无法预料的结果,先得到最高文件描述值,然后用一个循环程序,关闭0到最高文件描述符值的所有文件描述符。

5.将当前目录更改为根目录。

当守护进程当前工作目录在一个装配文件系统时,改文件系统不能被拆卸。一般需要将工作目录改为根目录。

6.将文件创建时使用的屏蔽字设置为0。

进程从创建它的父进程那里继承的文件创建屏蔽字可能会拒绝某些许可权。为防止这一点,使用umask(0)将屏蔽字清零。

7.处理SIGCHLD信号。

这一点不是必须的,但是对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求,如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie),从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。

在Linux下可以简单的将SIGCHLD信号的操作设为SIG_IGN,这样子进程结束时就不会产生僵尸进程。

以上为文字叙述,下面我们用代码来解释:# include

# include

# include

# include

# include

# include

# include

# include

int init_daemon(void)

{

int pid;

int i;

/*忽略终端IO信号,STOP信号*/

signal(SIGTTOU, SIG_IGN);

signal(SIGTTIN, SIG_IGN);

signal(SIGTSTP, SIG_IGN);

signal(SIGHUP, SIG_IGN);

pid = fork();

if(pid > 0)

{/*结束父进程,使子进程成为后台进程*/

exit(0);

}

else if(pid <0)

{

return -1;

}

/*建立一个新的进程组&#xff0c;在这个新的进程组中&#xff0c;子进程成为这个进程组的首进程&#xff0c;以使该进程

脱离所有终端*/

setsid();

/*再次新建一个子进程&#xff0c;退出父进程&#xff0c;保证该进程不是进程组长&#xff0c;同时让该进程无法再打开一个

新的终端*/

pid &#61; fork();

if(pid > 0)

{

exit(0);

}

else if(pid <0)

{

return -1;

}

/*关闭所有父进程继承的不再需要的文件描述符*/

for(i &#61; 0; i

{

;

}

/*改变工作目录&#xff0c;使得进程不与任何文件系统联系*/

chdir("/");

/*将文件屏蔽字设置为0*/

umask(0);

/*忽略SIGCHLD信号*/

signal(SIGCHLD, SIG_IGN);

return 0;

}

int main(void)

{

time_t now;

init_daemon();

syslog(LOG_USER | LOG_INFO, "Test daemon \n");

while(1)

{

sleep(8);

time(&now);

syslog(LOG_USER | LOG_INFO, "system time : \t%s\t\t\n", ctime(&now));

}

return 0;

}

但是要对Linux进行一些配置&#xff1a;

使用syslog()函数前&#xff0c;首先配置/etc/syslog.conf&#xff0c;在该文件最后末尾加上&#xff1a;

user.* /var/log/test.log

然后重启syslog服务。

/etc/init.d/syslog stop

/etc/init.d/syslog start

feb49d9fe1e4031128051ecb4cd22bc3.png

24a24b195c769e1fec02ef67a182e53a.png

运行结果&#xff1a;ps -ef

0f1c583eebbbeb0f71ad8d3bca807911.png

387ec9e47d1b10c9e2a75836f3795e47.png



推荐阅读
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Linux磁盘的分区、格式化的观察和操作步骤
    本文介绍了如何观察Linux磁盘的分区状态,使用lsblk命令列出系统上的所有磁盘列表,并解释了列表中各个字段的含义。同时,还介绍了使用parted命令列出磁盘的分区表类型和分区信息的方法。在进行磁盘分区操作时,根据分区表类型选择使用fdisk或gdisk命令,并提供了具体的分区步骤。通过本文,读者可以了解到Linux磁盘分区和格式化的基本知识和操作步骤。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
author-avatar
cresslyty_723
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有