基础Linux进程命令
查看进程信息:
ps:查看系统进程快照 ps ; ps-ef|more ; ps-ef|grep xxx ; ps aux |grep xxx (有显示进程当前状态-进程状态码man ps有说明)
top:查看进程动态信息
/proc:查看进程详细信息 cd /proc 进入相关进程号的文件 fd文件是当前进程打开的所有文件的信息
nice 按用户指定的优先级运行进程 -20~+19 值越小优先级越高,默认为0
用法:nice -n 2 ./test 注:普通用户无权限指定0以下的nice值
renice 改变正在运行进程的优先级 renice -n 2 PID 注:普通用户不能提高优先级,只能降低优先级
./test & 把进程挂后台
jobs 查看后台终端进程 :[x] PID X:作业号
bg 将挂起的进程在后台运行 bg X
fg 把后台运行的进程放到前台运行 fg X
ctrl + Z 将前台进程在后台挂起并处于停止态
进程创建
#include<unistd.h>
创建进程 pid_t fork(void);
创建新的进程,失败时返回-1;
成功时父进程返回子进程的进程号(PID),子进程返回0;getpid() 获取当前进程的进程号
子进程会继承父进程的绝大多数内容,父子进程都有独立的地址空间
若父进程先结束,子进程会成为孤儿进程,被init进程收养(linux 内核启动后创建的第一个用户态进程就是init进程,PID=1)
子进程变成后台进程
若子进程先结束,父进程为及时回收,子进程会变成僵尸进程
结束当前的进程:void exit(int status);void _exit(int status);
结束当前的进程并将status返回,exit会刷新流缓冲区,_exit不会
其他补充
exec函数族 execl execlp execv execvp
int execl(const char *path,const char *arg,....);执行指定path对应的程序(包含路径),失败返回EOF:-1
执行ls命令,显示/etc目录下所有文件的详细信息
if(execl("/bin/ls","ls","-al","/etc",NULL)<0){perror("execl");}
int execlp(const char *file,const char *arg,....);执行指定程序,file程序名称,在PATH中查找
if(execlp("ls","ls","-al","/etc",NULL)<0){perror("execl");}
char *arg[]={"ls","-al","/etc",NULL};
execv("/bin/ls",arg)
execvp("ls",arg)
#include<stdlib.h>
int system(const char *command);成功返回命令command的返回值,失败返回EOF
system("ifconfig");system("pause");
进程回收
1:pid_t wait(int *status);-回收任意的子进程
成功时返回回收子进程的进程号,失败返回EOF
若子进程没有结束,父进程一直阻塞
若有多个子进程,那个先结束就先回收
status 指定保存子进程返回值和结束方式的地址
status为NULL表示直接释放子进程PCB,不接收返回值
父进程调用wait(&status)回收
子进程通过exit _exit return 返回某个值0~255 ,只有第八位,即最低字节的值才会呗父进程接收
宏:WIFEXITED(status) 判断子进程是否正常结束 ,返回逻辑真逻辑假
WEXITSTATUS(status) 获取子进程返回值
WIFSIGNALED(status) 判断子进程是否被信号结束
WTERMSIG(status) 获取结束子进程的信号类型
2:pid_t waitpid(pid_t pid,int *status,int option)
成功返回回收的子进程的pid或0,失败返回EOF,回收指定的子进程,status指定用于保存子进程返回值和结束方式的地址
option:指定回收方式,0 (阻塞)或WNOHANG (非阻塞)
pid 若为-1,表示当前进程的任意一个进程
Tips:创建一个守护进程步骤
1,创建子进程,父进程退出 if(fork()>0){exit(0);}
2,子进程创建新会话 if(setsid()<0){exit(-1);}
3,修改当前工作目录 chdir("/");chdir("/tmp");权限不同,普通用户/可执行,可读,不可写 tmp文件权限为777。
守护进程一直在重中之重在后台运行,其工作目录不能被卸载,重新设定当前工作目录cwd
4,重新设置文件权限掩码 if(umask()<0){exit(-1);} 一般设置掩码为0,只影响当前进程
5,关闭从父进程继承的文件描述符,即关闭所有从父进程继承的打开文件
int i;for(i=0;i<getdtablesize();i++){close(i);}
getdtablesize:当前进程打开最大文件的个数。此时改以脱离终端,stdin/out/err无法使用。
例:创建守护进程,每隔1s将系统时间写入文件time.log
int main(){
pid_t pid;
FILE *fp;
time_t t;
int i;
if(pid = fork()<0)
{
perror("fork");
exit(-1);
}
else if(pid>0)
{
exit(0);
}
setsid();
umask(0);
chdir("/tmp");
for(i=0;i<getdtablesize();i++){close(i);}
if((fp = fopen("time.log","a")) == NULL)
{
perror("fopen");exit(-1);
}
while(1)
{
time(&t);
fprintf(fp,"%s",ctime(&t));
fflush(fp);
sleep(1);
}
return 0;
}
Linux 进程的一些基础知识
于 2021-09-21 14:58:34 首次发布