第九章 守护进程与socket编程(重点)

(一) 守护进程

   守护进程(Daemon)是指那些随着系统启动,一直运行于系统整个生命周期的系统程序,它们一般不受用户登录注销影响。 它独立于控制终端并且周期性地执行某种任务或等待。

   会话(session)是一个多个进程组的集合,每个进程都有一个父进程并且属于一个进程组,每个进程组都有一个进程组号,该号等于该进程组组长的PID号,一个进程只能为它自己或子进程设置进程组ID号。

   每个进程都属于一个进程组,而进程组又属于某个会话。当用户从终端登录系统(不管是终端还是伪终端),系统会创建一个新的会话。在该终端上启动的进程都会被系统划归到会话的进程组中。 会话中的进程通过该会话中的领头进程(常称其为控制进程)与一个终端相连。该终端是会话的控制终端。一个会话只能有一个控制终端,反之一样。如果会话存在一个控制终端,则它必然拥有一个前台进程组。属于该组的进程可以从控制终端获得输入。这时,其他的进程组都为后台进程组。

  创建守护进程步骤:

  1>  脱离父进程  fork 创建子进程且退出父进程。这样,子进程将变成孤儿进程,并被init进程接管,同时,所产生的新进程将变为在后台运行。

  2> 调用setsid函数 使得新创建的进程脱离控制终端,同时创建新的进程组,并成为该进程组的首进程。

     由于守护进程没有控制终端,而使用fork函数创建的子进程继承了父进程的控制终端、会话和进程组,因此,必须创建新的会话,以脱离父进程的影响。
setsid函数将创建新的会话,并使得调用setsid函数的进程成为新会话的领头进程。调用setsid函数的进程是新创建会话中的惟一的进程组,进程组ID为调用进程的进程号。setsid函数产生这一结果还有个条件,即调用进程不为一个进程的领头进程。由于在第一步中调用fork的父进程退出,使得子进程不可能是进程组的领头进程。该会话的领头进程没有控制终端与其相连。至此,满足了守护进程没有控制终端的要求 

  3>更改当前工作目录 ,守护进程一般会将其工作目录更改到根目录.

  4>关闭文件描述符.

  5>设置守护进程的文件权限创建掩码 .

  6> 功能实现

(2)Socket

  Socket 套接口,是网络通信的载体。(相当于你告诉它目的地址,它就会把数据运送的目的地址)。

  Socket建立: int socket(int domain, int type, int protocol);

    Socket配置: int bind(int sockfd,struct sockaddr *my_addr, int addrlen);

  监听连接:  int accept(int s, struct sockaddr *addr, socklen_t *addrlen);

  连接建立: int connect(int sockfd, struct sockaddr *serv_addr,int addrlen);
  数据传输: 

    1> TCP :  int send(int sockfd, const void *msg, int len, int flags);

          int recv(int sockfd,void *buf,int len,unsigned int flags);

    2> UDP :  int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct sockaddr *from,int *fromlen);

          int sendto(int sockfd, const void *msg,int len,unsigned int flags,const struct sockaddr *to, int tolen);


  结束传输:  int shutdown(int sockfd,int how);

(3) 感言

  由于linux 开发大多用于服务开发模型,不会面向桌面(当然 除了嵌入式),而服务开发有离不开网络。所以将二者结合起来讲解。本章事例程序参见 【工程库】/【跨平台服务开发模板】http://www.cnblogs.com/wolfrickwang/p/3192941.html。 

 

原文地址:https://www.cnblogs.com/wolfrickwang/p/3192949.html