Linux 进程的一些基础知识

​
基础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;
}

​

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值