编译c程序:gcc
gcc -o 文件名 文件
终端与进程的关系:
1)终端与bash进程
pts:虚拟终端,每连接一个虚拟终端到Ubuntu,就会出现一个bash进程(shell壳) 黑窗口, 用于解释用户输入的命令
2)终端上的开启进程:
随着终端退出, 终端上的进程也就退出了。
进程关系进一步分析:
每个进程还属于一个进程组, 一个或者多个进程的集合, 每个进程组有一个唯一的进程组ID
可以调用系统函数来创建进程组, 加入进程组
“会话”session :包含一个或多个进程组
一般,只要不进行特殊系统函数调用, 一个bash上运行的所有程序属于一个会话 session leader就是这个bash
// ps -eo pid,ppid,sid,tty,pgrp,comm | grep -E 'bash|PID|nginx'
如果xshell要断开 系统会发送信号(终端断开信号) 给session leader, 也就是这个bash
bash收到sighup信号后, 终端会把这个信号发送个所有进程 缺省动作就是退出。
strace工具的使用
linux下调试分析诊断工具,可以跟踪程序执行时进程的系统调用以及所收到的信号
跟踪你的测试进程:sudo strace -e trace=signal -p 进程ID
终端关闭时如何让进程不退出:
拦截信号:signal(SIGHUB, SIG_IGN); sig_ign:要求忽略信号
bash进程 和测试程序不在一个session中:setsid()(进程组组长调用session是无效的)
应使用如下写法:
pid_t pid;
pid = fork() # 子进程从fork之后开始执行
if (pid <0)
printf("error");
else if (pid == 0)
setsid()
你的程序
直接用setsid() ./nginx 这样启动的程序不属于任何bash
nohub ./nginx 这样就不会在屏幕上输出, 会重定向到nohub.out中
后台运行:执行程序的同时, 终端可以干其他事;
fg:切换到前台
bg:切换到后台