nginx源码学习方法 - Linux C++网络编程(七)

一:nginx源码学习方法

(1)简单粗暴,啃代码,比较艰苦,需要比较好的基础

(2)看书看资料,逃脱不了啃代码的过程

(3)跟着老师学,让大家用最少的力气掌握nginx中最有用的东西。

架构课程前期学习两个主要任务;

(1)泛读nginx中的一些重要代码;

(2)把nginx中最重要的代码提取出来作为我们自己知识库的一部分以备将来使用;


 

二:终端和进程的关系

(2.1)终端与bash进程

ps -ef | grep bash

pts(虚拟终端),每连接一个虚拟终端到乌班图linux操作系统,

            就会出现 一个bash进程(shell[壳]),黑窗口,用于解释用户输入的命令

                bash = shell = 命令行解释器

whereis bash

(2.2)终端上的开启进程

ps -la

man ps

随着终端的退出,这个终端上运行的进程nginx也退出了;

可执行程序nginx是bash的子进程;

book@www.100ask.org:/usr/local/nginx/sbin$ ps -ef | grep bash                  
book       2293   2292  0 15:05 pts/8    00:00:02 -bash
book       3565   3564  0 16:45 ?        00:00:00 bash
book      10976  10975  0 21:51 pts/10   00:00:00 -bash
book      11017   2293  0 21:52 pts/8    00:00:00 grep --color=auto bash
book@www.100ask.org:/usr/local/nginx/sbin$ ps -ef | grep nginx 
book      11011  10976  0 21:52 pts/10   00:00:00 ./nginx
book      11015   2293  0 21:52 pts/8    00:00:00 grep --color=auto nginx

《unix环境高级编程》第九章 进程关系;

(2.3)进程关系进一步分析

每个进程还属于一个进程组:一个或者多个进程的集合,每个进程组有一个唯一的进程组ID,可以调用系统 函数来创建进程组、加入进程组

“会话”(session):是一个或者多个进程组的集合

一般,只要不进行特殊的系统函数调用,一个bash(shell)上边运行的所有程序都属于一个会话,而这个会话有一个session leader;

    那么这个bash(shell)通常就是session leader; 你可以调用系统功函数创建新的session。

ps -eo pid,ppid,sid,tty,pgrp,comm | grep -E 'bash|PID|nginx'

   PID   PPID    SID TT         PGRP COMMAND
  2293   2292   2293 pts/8      2293 bash
  3565   3564   3565 ?          3565 bash
 10218   3502  10218 pts/9     10218 bash
 10976  10975  10976 pts/10    10976 bash
 11011  10976  10976 pts/10    11011 nginx

a)如果我 xshell终端要断开的话,系统就会发送SIGHUP信号(终端断开信号),给session leader,也就是这个bash进程

b)bash进程 收到 SIGHUP信号后,bash会把这个信号发送给session里边的所有进程,收到这个SIGHUP信号的进程的缺省动作就是退出;

(2.4)strace工具的使用

linux下调试分析诊断工具:可以跟踪程序执行时进程的系统调用以及所收到的信号;

a)跟踪nginx进程   :   sudo strace -e trace=signal -p 1359

kill(4294965937, SIGHUP)   :发送信号SIGHUP给这个 -1359的绝对值所在的进程组;所以nginx进程就收到了SIGHUP信号

综合来讲,这个bash先发送SIGHUP给  同一个session里边的所有进程;

    然后再发送SIGHUP给自己;

int abc = 4294965937; //-1359

(2.5)终端关闭时如何让进程不退出

设想

a)nginx进程拦截(忽略)SIGHUP(nginx收到这个信号并告诉操作系统,我不想死,请不要把我杀死)信号,是不是可以;

b)nginx进程和bash进程不再同一个seeion里;

孤儿进程

setsid函数不适合进程组组长调用;

setsid命令:启动一个进程,而且能够使启动的进程在一个新的session中,这样的话,终端关闭时该进程就不会退出,试试

setsid ./nginx

nohup(no hang up不要挂断),用该命令启动的进程跟上边忽略掉SIGHUP信号,道理相同

该命令会把屏幕输出重新定位到当前目录的nohup.out。这个可以对复杂的文件打印输出进行屏蔽。

ps -eo pid,ppid,sid,tty,pgrp,comm,cmd|grep -E 'bash|PID|nginx'



#include <stdio.h>
#include <unistd.h>

//#include <signal.h>

int main(int argc, char *const *argv)
{       
    // 统一入口
    pid_t pid;    
    printf("非常高兴,HelloWorld\n");

    // 实验3:多进程
    pid = fork(); //系统函数,用来创建新进程。子进程会从fork()调用之后开始执行
    if(pid < 0)
    {
        printf("fork()进程出错!\n");
    }
    else if(pid == 0)
    {
        //子进程这个条件会满足
        printf("子进程开始执行!\n");
        setsid(); //新建立一个不同的session,但是进程组组长调用setsid()是无效的
        for(;;)
        {
            sleep(1); //休息1秒
            printf("子进程休息1秒\n");
        }
        return 0;
    }
    else
    {
        //父进程会走到这里
        printf("父进程开始执行!\n");
        for(;;)
        {
            sleep(1); //休息1秒
            printf("父进程休息1秒\n");
        }
        return 0;
    }

    // 实验2:程序section收到signalup信号不退出
    // 2.1 系统函数,设置某个信号来的时候处理程序(用哪个函数处理)
    // signal(SIGHUP,SIG_IGN); //SIG_IGN标志:我要求忽略这个信号,请操作系统不要用缺省的处理方式来对待我(不要把我杀掉);
    // 2.2 可以将nginx和bash放在不同的section中,将自己放置在独立的section。但是单纯
    // 这一条命令是没有办法实现要求的,需要通过实验3的方式实现不同的section操作。
    // setsid();


    // 实验1:程序死循环直接运行
    //for(;;)
    //{
    //    sleep(1); //休息1秒
    //    printf("休息1秒\n");
    //}

    // 统一出口
    printf("程序退出,再见!\n");
    return 0;
}


 

(2.6)后台运行 &

后台执行,执行这个程序的同时,你的终端能够干其他事情;你如果不用 后台执行,那么你执行这个程序后

    你的终端就只能等这个程序完成后才能继续执行其他的操作;

fg切换到前台

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值