在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