//守护进程--读文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
#include "mylog.h" //监听管道
void listenfifo()
{
//file size
int len=;
int fd2=;
char buf[]={};
//打开管道文件(管道文件一般用系统函数读取)
int fd=open("/home/test/1/fifo1",O_RDONLY);
if(fd==-)
{
writelog("/home/test/1/mylog.txt","open the fifio1 failed !");
//printf("open the fifio1 failed ! error message :%s\n",strerror(errno));
return;
}
len=read(fd,buf,sizeof(buf));
if(len<=)
{
writelog("/home/test/1/mylog.txt","read the fifo1 is failed !");
//printf("read the fifo1 is failed ! error code is %d\n",len);
return;
}
if(buf[strlen(buf)-]=='\n')
{
buf[strlen(buf)-]=;
}
writelog("/home/test/1/mylog.txt",buf);
//close the fifo1
close(fd);
//关闭标准输出
close(STDOUT_FILENO);
//将指定文件作为标准输出--输出文件只能写
fd2=open(buf,O_WRONLY);
memset(buf,,sizeof(buf));
sprintf(buf,"fd2=%d\n",fd);
writelog("/home/test/1/mylog.txt",buf);
} //消息处理机制
void catch_signal(int sign)
{
switch(sign)
{
case SIGINT:
listenfifo();
break;
}
} //读文件
int readmyfile(const char * path)
{
if(path==NULL)
{
printf("param is not allow NULL !\n");
return -;
}
//管道文件不使用C语言库函数
char buf[]={};
int fd=open(path,O_RDONLY);
if(fd==-)
{
printf("open the fifo failed ! error message :%s\n",strerror(errno));
return -;
}
/*
read()函数在读取管道文件的时候,会阻塞进程,当管道的另一端正常关闭,read函数返回0,非正常关闭返回-1
*/
while(read(fd,buf,sizeof(buf))>)
{
printf("%s",buf);
memset(buf,,sizeof(buf));
}
close(fd);
return ;
} //创建守护进程
int setdaemon()
{
pid_t pid=fork();
if(pid==-)
{
printf("fork error ! error message :%s\n",strerror(errno));
exit();
}
if(pid==)
{
//child process
setsid();
chdir("/");
umask();
/*
close(STDIN_FILENO);
close(STDERR_FILENO);
*/
}
if(pid>)
{
exit();
}
return ;
} //捕捉消息
int mysignnal(int sign,void (*func)(int))
{
struct sigaction act,oact;
act.sa_handler=func;
sigemptyset(&act.sa_mask);
act.sa_flags=;
return sigaction(sign,&act,&oact);
} int main(int arg,char * args[])
{
if(arg<)
{
printf("请输入一个参数!\n");
return -;
}
setdaemon();
//注册消息
mysignnal(SIGINT,catch_signal);
//readmyfile(args[1]);
while()
{
printf("I'm living!\n");
sleep();
}
return ;
}
.SUFFIXES:.c .o
CC=gcc
SRCS=tec01.c
OBJS=$(SRCS:.c=.o)
EXEC=tecd start:$(OBJS)
$(CC) -L. -lmylog -o $(EXEC) $(OBJS)
@echo "------OK----------"
.c.o:
$(CC) -Wall -g -o $@ -c $<
clean:
rm -f $(OBJS)
rm -f $(EXEC)

小结:
这个程序写代码20分钟完成,但是调试却花了40分钟,我给守护进程发送信号,守护进程并不输出内容,其中我犯了两个错误
--第一个错误;我在创建守护进程的时候,将标准输出,标准输入,标准出错这三个文件描述符全部关闭了,导致我在listenfifo中打开的文件描述符实际上是标准输入(即fd=0)
 我通过日志观察到fd=0,使我想到我的文件描述符可能全部被关闭了,另外这个程序中我自己操作打开了2个文件描述符,一个是管道文件的,一个屏幕输出文件的
--第二个错误
标准输出应该是一个只写文件,但是我在open()函数中用的是O_RDONLY,所以也没有结果。

Linux 守护进程二(激活守护进程)的更多相关文章

  1. linux服务器开发二(系统编程)--进程相关

    进程相关的概念 程序与进程 程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(CPU.内存.打开的文件.设备.锁等等). 进程,是一个抽象的概念,与操作系统原理联系紧密.进程是活跃的程序,占用系 ...

  2. Linux内核学习之2号进程kthreadd

    Author       : Toney Email         : vip_13031075266@163.com Date          : 2020.12.04 Copyright : ...

  3. 二十三、Linux 进程与信号---进程链和进程扇、守护进程和孤儿进程以及僵尸进程

    23.1 进程链和进程扇 23.1.1 概念 进程链:一个父进程构建出一个子进程,子进程再构建出子子进程,子子进程构建出子子子进程.... 这种就为进程链 进程扇:一个父进程构建出多个子进程,子进程都 ...

  4. Linux 进程(二):进程关系及其守护进程

    进程关系 进程组 进程组是一个或多个进程的集合.通常,它们是在同一作业中结合起来的,同一进程组中的各进程接收来自同一终端的各种信号,每个进程组有一个唯一的进程组ID.每个进程组有一个组长进程,该组长进 ...

  5. Linux中的两种守护进程stand alone和xinetd

    Linux中的两种守护进程stand alone和xinetd --http://www.cnblogs.com/itech/archive/2010/12/27/1914846.html#top 一 ...

  6. [Linux] PHP程序员玩转Linux系列-使用supervisor实现守护进程

    1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...

  7. ASP.NET Core Linux下为 dotnet 创建守护进程(必备知识)

    前言 在上篇文章中介绍了如何在 Docker 容器中部署我们的 asp.net core 应用程序,本篇主要是怎么样为我们在 Linux 或者 macOs 中部署的 dotnet 程序创建一个守护进程 ...

  8. ASP.ENT Core Linux 下 为 donet创建守护进程(转载)

    原文地址:http://www.cnblogs.com/savorboard/p/dotnetcore-supervisor.html 前言 在上篇文章中介绍了如何在 Docker 容器中部署我们的 ...

  9. Linux进程学习(孤儿进程和守护进程)

    孤儿进程和守护进程 通过前面的学习我们了解了如何通过fork()函数和vfork()函数来创建一个进程.现在 我们继续深入来学习两个特殊的进程:孤儿进程和守护进程 一.孤儿进程 1.什么是 孤儿进程如 ...

  10. Linux进程实践(5) --守护进程

    概述 守护进程是在需要在后台长期运行不受终端控制的进程,通常情况下守护进程在系统启动时自动运行,在服务器关闭的时候自动关闭:守护进程的名称通常以d结尾,比如sshd.xinetd.crond.atd等 ...

随机推荐

  1. Android项目实战(十六):QQ空间实现(一)—— 展示说说中的评论内容并有相应点击事件

    大家都玩QQ空间客户端,对于每一个说说,我们都可以评论,那么,对于某一条评论: 白雪公主 回复 小矮人 : 你们好啊~ 我们来分析一下: .QQ空间允许我们 点击 回复人和被回复人的名字就可以进入对于 ...

  2. Android 6.0权限管理

    Android 6.0权限管理 关于权限管理 Android6.0 发布之后,Android 的权限系统被重新设计.在 23 之前 App 的权限只会在用户安装的时候询问一次,App一旦安装后就可以使 ...

  3. iOS-多线程之NSThread详解

    前言 线程是用来执行任务的,线程彻底执行完任务A才能去执行任务B.为了同时执行两个任务,产生了多线程. 我打开一个视频软件,我开辟一个线程A让它执行下载任务,我开辟一个线程B,用来播放视频.我开辟两个 ...

  4. Windows 7 与 Vmware Ubuntu 15.10_64 共享文件夹

    设置共享文件夹     安装/更新最新的vmware-tools   安装             在ubuntu 内部会打开DVD ,里面的压缩包中包含vmware-toole. 先解压      ...

  5. 测试管理_出色测试管理者的思考[持续更新ing]

    如何合理安排并按质按量按时完成每一个测试任务,做好项目管理? 如何把控到每一个测试任务的质量? 如何快速构建和构建好测试环境? 如何获取或快速制作测试数据? 如何确保每一个测试人员的工作都饱满? 如何 ...

  6. MVC如何在单独的类库中添加区域

    今天要做一个将区域放到单独的类库中的程序,其实就是多加几个引用的问题,但是我比较喜欢这种设计结构,因为这样的话可以把单独的应用逻辑放在单独的类库中处理,项目看起来更清晰分明,所以写了这个随笔. 首先创 ...

  7. mongodb--java操作

    一.mongodb客户端 mongodb提供诸多语言的客户端,也包括java的客户端.通过这些客户端,我们可以很方便地使用编写代码的方式对mongodb进行操作.这里使用java客户端进行示例.使用j ...

  8. 关于统计变换(CT/MCT/RMCT)算法的学习和实现

    原文地址http://blog.sina.com.cn/s/blog_684c8d630100turx.html 刚开会每周的例会,最讨厌开会了,不过为了能顺利毕业,只能忍了.闲话不多说了,下面把上周 ...

  9. 非ios系统是否还有出路?

    **@SoftwareTeacher**        这位老师提出的问题我很喜欢,所以单拿出一篇文章,认真的回复.        PS: 因学校网很差,所以现在才来回复哈,见谅.以下为正文     ...

  10. java如何连接testlink

    1.下载相关的jar包 2.获取到testlink的url和key,注意:url不是testlink的连接地址,是连接地址+/lib/api/xmlrpc.php 3.测试是否连接成功 public ...