nginx源码学习,linux下,session,进程之间的一些关系

在Linux中编译

  • c用gcc便于
    gcc -o targetName SourceName
  • c++用g++编译
    g++ -o targetName SourceName
  • 运行
    ./targetName

前提知识

我也学得不深,这里随便说一下
启动一个bash终端,便会启动一个新的session会话,那么在这个终端上所启动进程父进程都是这个bash终端,并且终端和它的子进程都在同一个session会话中,并且终端关闭时,会向所有SID(session id,会话id)相同进程发送SIGHUP信号,接收到这个信号便会进行关闭
那么结论就是说,你开起了一个终端,并在这个终端上开启了一些程序,你退出时便会都结束。

解决终端关闭时子进程关闭的方法

1、程序中signal(SIGHUP,SIG_IGN);

程序要求忽略这个信号,因为进程是和bash终端联系在一起的
如果你在这个终端开启了一个进程,关闭终端时,这个终端所开启的进程都会
默认接收到SIGHUP这个信号,进行关闭,那么我们的程序也就不能持续运行了
那么脱离了bash的父进程,子进程的父进程就变成1,初始进程

int main()
{
	signal(SIGHUP, SIG_IGN);
	for (; ; )
	{
		sleep(1);
		printf("进程正在运行\n");
	}
}

2、程序中,pid,setsid,创建新的进程,在子进程中创建新的session

因为进程组组长不能进行新的session的创建,所以要创建新的进程来进行新的会话的创建

int main()
{
	pid_t pid;
	pid = fork();
	//pid<0是fork创建新的进程失败
	if (pid < 0)
	{
		printf("创建子进程失败");
	}
	//pid==0是子进程
	else if (pid == 0)
	{
		//创建新的会话session,因为进程组组长不能setsid,创建新的会话
		//所以只能在子进程中进行创建
		setsid();
		printf("子进程开始执行");
		for (; ; )
		{
			sleep(1);
			printf("子进程正在运行\n");
		}
	}
	else
	{
		for (; ; )
		{
			sleep(1);
			printf("父进程正在运行\n");
		}
	}
}

3、bash中,直接用setsid进行运行,让新启动的进程在新的session进行运行

setsid ./LinuxTestC

4、bash中,使用nohup ./LinuxTestC 来进行,让创建的进程不接受会话发来的SIGHUP信号

nohup ./LinuxTestC
发布了157 篇原创文章 · 获赞 167 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_40666620/article/details/103085009