linux 进程 控制终端,linux系统编程之进程(五):终端、作业控制与守护进程

#include#define ERR_EXIT(m)

do {

perror(m);

exit(EXIT_FAILURE);

} while(0)

int setup_daemon(int, int);

/* 守护进程一直在后台运行且无控制终端 */

int main(int argc, char *argv[])

{

//  daemon(0, 0)

setup_daemon(0, 0);

printf("test ...

"); // 无输出

for(;;) ;

return 0;

}

int setup_daemon(int nochdir, int noclose)

{

pid_t pid;

pid = fork();

if (pid == -1)

ERR_EXIT("fork error");

if (pid > 0)

exit(EXIT_SUCCESS);

/* 调用setsid的进程不能为进程组组长,故fork之后将父进程退出 */

setsid(); // 子进程调用后生成一个新的会话期

if (nochdir == 0)

chdir("/"); //更改当前目录为根目录

if (noclose == 0)

{

int i;

for (i = 0; i

close(i);

open("/dev/null", O_RDWR); // 将标准输入,标准输出等都重定向到/dev/null

dup(0);

dup(0);

}

return 0;

}

执行程序再ps axj 一下:

simba@ubuntu:~/Documents/code/linux_programming/APUE/process$ ./daemon

simba@ubuntu:~/Documents/code/linux_programming/APUE/process$ ps axj

PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND

...........................................................................................................................

1  7678  7678  7678 ?           -1 Rs    1000   0:03 ./daemon

可以看出守护进程的ID也是进程组的ID,也是会话期的ID,此外这个会话期没有前台进程组。

五、使用daemon函数实现守护进程

功能:创建一个守护进程

原型:int daemon(int nochdir, int noclose);

参数:

nochdir:=0将当前目录更改至“/”

noclose:=0将标准输入、标准输出、标准错误重定向至“/dev/null”

注:也有一些说法,表示daemon 实现是fork 2 次,具体可以google fork 2 times daemon,据说主要是为了避免子进程的僵尸进程问题。

C++ Code

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

int daemon()

{

int  fd;

pid_t pid;

if((pid = fork()) != 0)

{

exit(0);

}

setsid();

signal(SIGINT, SIG_IGN);

signal(SIGHUP, SIG_IGN);

signal(SIGQUIT, SIG_IGN);

signal(SIGPIPE, SIG_IGN);

signal(SIGTTOU, SIG_IGN);

signal(SIGTTIN, SIG_IGN);

signal(SIGCHLD, SIG_IGN);

signal(SIGTERM, SIG_IGN);

struct sigaction sig;

sig.sa_handler = SIG_IGN;

sig.sa_flags = 0;

sigemptyset(&sig.sa_mask);

sigaction(SIGPIPE,&sig,NULL);

umask(0);

if((pid = fork()) != 0)

{

exit(0);

}

fd = open("/dev/null", O_RDWR);

dup2(fd, STDIN_FILENO)

dup2(fd, STDOUT_FILENO)

return 0;

}

参考:《linux c 编程一站式学习》、《APUE》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564437.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

arduino 温度调节器_Arduino用温湿度传感器控制继电器,为什么点了串口助手才能运行,拔掉usb线,直接外界9V电源却用不了...

用温湿度传感器控制继电器,为什么点了串口助手才能运行,拔掉usb线,直接外界9V电源却用不了,以下是程序,目的是在湿度达到40%的时候继电器吸合,45%后,继电器断开,求各位大神指教...用…

C++中指针与引用的区别

指针的本质 指针p也是对象,只不过p存储的数据类型是它所指的对象的地址。可以通过解引用操作符“”来访问对象的值,即p。 对象有常量(const)和非常量之分,如果指针本身是常量,即指针常量,指这…

python支持按指定字符串分割成数组_python – 如何切割numpy数组字符串的每个元素?...

这是一个矢量化的方法 –def slicer_vectorized(a,start,end):b a.view(S1).reshape(len(a),-1)[:,start:end]return np.fromstring(b.tostring(),dtypeSstr(end-start))样品运行 –In [68]: a np.array([hello, how, are, you])In [69]: slicer_vectorized(a,1,3)Out[69]:ar…

数据库的概念

数据存储方式 计算机数据(Data)的存储一般以硬盘为数据存储空间资源,从而保证计算机内的数据能够持续保存。对于数据的处理,一般会采用数据库相关的技术进行处理,从而保证数据处理的高效性。 采用数据库的管理模式不…

高中关于人工智能方面的课题_2019山东人工智能教育专项课题指南选题

人工智能教育专项课题,2019年度山东省教育规划课题已经启动,申报者有这方面的申报意向,就需要知道选题范围,以下是2019山东人工智能教育专项课题指南选题。小学人工智能教育课程体系、教学策略及教学评价的研究初中人工智能教育课…

linux qt5.9交叉编译,QT5.9移植

1.下载Qt源码Qt源码下载地址:Index of /archive/qt 其他源码和其他安装包都是有的。2.解压源码$ mkdir qt5.9$cd qt5.9将下载文件拷贝到当前目录下面。解压$ xz -d qt-everywhere-opensource-src-5.9.7.t…

python雪花算法生成id_理解分布式id生成算法SnowFlake

分布式id生成算法的有很多种,Twitter的SnowFlake就是其中经典的一种。概述SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图:1位,不用。二进制中最高位为1的都是负数,但是我们生成的id一般都使用整数&a…

linux wps 公式编辑器,WPS 2012数学公式编辑器的使用方法(详细图解)

做数学或物理课件时很多公式是件比较头痛的事。时常陷入无穷的拼接法中,用一个一个文本框组合成复杂的公式。其实WPS 2012e为我们提供了一个功能强大的公式编辑器Equation Editor,可以帮助我们解决这些问题。1、插入公式将光标放置于欲插入公式的位置&am…

linux utmp结构体,Linux C编程如何使用联机帮助来解决编程问题?

1.背景多次学习C语言一直无法踏入C语言的大门,每次都是在学习C语言中的那些系统调用库函数等望而却只,linux下的系统调用需要我们去记忆一些没有规律的结构体和一些大写的宏定义并且还有一个函数多种形式的例如print fprintf sprintf等等,看起…

ios 画线平滑_iOS 画贝塞尔曲线 连续曲线 平滑曲线 曲线图表

利用贝塞尔曲线画一段连续曲线bezierDemo2.pngbezierDemo1.pngimage.png如果我们根据几个点画一条连续的曲线, 我们使用的方法是- (void)addCurveToPoint:(CGPoint)endPoint controlPoint1:(CGPoint)controlPoint1 controlPoint2:(CGPoint)controlPoint2;这个方法是由一个结束点…

python中怎么判断字母大小写_python判断字符串是字母 数字 大小写(转载)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼今天遇到的字符串处理的问题,记录一下方便使用str1 input(请输入一个字符:)#初始化字符、数字、空格、特殊字符的计数lowercase 0uppercase 0number 0space 0other 0for strs in str1:#如果在字符串中…

深度linux安装好上不了网,Deepin Linux 无法上网

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼我又用回2008了LINUX图形界面还是太慢 我的感觉太敏锐 虽然LINUX的图形界面的延迟 从你鼠标发出信号 到XSERVER的视觉呈现也就几百毫秒 但还是感觉比WINDOWS NT的效率差了几百倍 .用的越久感觉越明显.WINDOWS图形界面下的操控不管你…

php 伪静态 获取当前页面路径_织梦移动适配PHP获取当前页面URL地址方法

在做织梦网站开发时,会遇到获取当前URL并做PHP判断。比如地区站群PC端的移动适配功能,下面提供PHP通用移动端适配方法。PC首页路径:www.xx.com移动端首页路径:m.xx.com地区PC首页路径:beijing.xx.com地区移动端首页路径…

linux客户端 存活检测,Linux下客户端检测服务器的 heartbeat

客户端代码,和一般的客户端不一样#include#include#include#include#include#include#include#include#include#include#include #include #define MAXDATASIZE 100int main(){int sockfd,nbytes,serv_port;char buf_serv_ip[16],buf[260];struct sockaddr_in serv_…

lua打开浏览器并加载网页_Lua访问网页

示例例子,实现https方式,登录网站,访问某个网页,修改其中参数的功能。其中xx应用时候需要修改。require("curl")local ipList {"192.168.1.1","192.168.1.1",}--登陆function loginWeb(ip)c curl.…

linux jar和zip,Linux命令———zip和jar文件压缩解压

Linux命令———zip和jar文件压缩解压(1)ubuntu 使用unzip和zip压缩文件1.功能作用:解压缩zip文件2.位置:/usr/bin/unzip3.格式用法:unzip [-Z] [-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir]4.主要参数-c 将解压缩的结果显示…

python去除中间空格只留一个_python 删除字符串中的连续空格只保留一个

Centos 6.5(64bit)上安装Vertica single node在Win8上使用虚拟机Virtualbox安装Centos6.5,想在上面安装vertica. 以下记录了我在安装的过程中遇到的问题与一些解决方案. 1.安装Centos的时候遇到了一个恼人的问题,即 ...大型网站系统架构实践(四)h…

安卓 linux找回内置存储,Android手机自带内部存储路径的获取

我有一台中兴的Android手机,型号是 ZTE U930HD,手机没有插入外置SD卡(也就是Micro SD Card,原名Trans-flash Card(TF卡),2004年正式更名为Micro SD Card),但是机身自带了一个内置存储卡(也就是eMMC存储,大小…

原生js获取document_原生JS常用API整理

Anchor 对象:指HTML超链接1.修改一个链接的文本,链接和target//html部分访问 Microsoft改变超链接的文本和 URL。也改变 target 属性。target 属性的默认设置是 "_self",这意味着会在相同的窗口中打开链接。通过把 target 属性设置…

linux打包cpio命令例子,linux压缩命令——tar、cpio详解

常见的linux压缩方式:*.Z compress压缩*.gz gzip压缩*.bz2 bzip2压缩*.tar tar打包(没有压缩)*.tar.gz tar打包,并且经过gzip压缩*.tar.gz tar打包,并且经过bzip2压缩gzip、bzip2压缩是对单一文件压缩。下面就t…