进程相关命令
ps
ps -ef
可以配合管道符 <|> 加上 more 或者 grep 来使用
ps aux
top
可以查看进程动态信息,并且可以查看进程的CPU和内存占用率
/proc
可以到 /proc 目录下查看目前进程的详细信息
niec 按指导的优先级运行程序
在 top 命令中 NI 代表优先级 普通用户创建的进程优先级默认为 0 ,优先级的范围 -20~19 ,普通用户只能指定0 ~ 19 通过 nice 指定进程优先级
renice 改变正在运行的进程的优先级
jobs 查看后台进程
可以通过 Ctrl z 来将前台的进程挂起到后台
bg 可以将挂起的进程在后台运行
fg 把后台的进程放前台运行
进程的一些函数
fork进程创建
fork()函数通过系统调用创建一个与当前进程几乎完全相同的进程,分别称为父进程和子进程,父子进程可以做相同的事情,也可以分别执行自己独特的命令。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
失败返回 -1 成功时 父进程返回子进程的进程号,子进程返回0
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t fpid;
if((fpid = fork()) < 0){
perror("fork");
return -1;
}
else if (fpid > 0){
printf("我是父进程,进程号 :%d\n",getpid());
}
else{
printf("我是子进程,进程号 :%d\n",getpid());
}
printf("Hello , Word!\n");
return 0;
}
执行结果 父子进程
- 子进程继承了父进程的内容
- 父子进程有独立的空间,互不影响
- 若父进程先结束
- 子进程变成了孤儿进程,被init进程收养
- 子进程变成后台进程
- 若子进程先结束
fork出错可能有两种原因: 1)当前的进程数已经达到了系统规定的上限,这时errno的值被设置为EAGAIN。 2)系统内存不足,这时errno的值被设置为ENOMEM。
exit/_exit 进程结束
- 结束当前的进程并将status返回
- exit结束时会刷新缓冲区,_exit则不会
exec 函数族
execl/execlp
- 成功时执行指定程序 , 失败返回 -1(EOF)
- path 执行程序名称,包括路径
- file 执行程序名称,在默认PATH中查找
execl("/bin/ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL);
execlp("ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL);
execv/execvp
- 成功时执行指定程序 , 失败返回 -1(EOF)
- argv[ ] 程序名称和执行的参数
char *const ps_argv[] = {"ps", "-o", "pid, ppid, session, tpgid, comm, NULL"};
execv("/bin/ps", ps_argv);
execvp("ps", ps_argv);
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[])
{
char *arg[] = {"ls", "-a", NULL};
if( fork() == 0 )
{
printf( "1------------execl------------\n" );
if( execl( "/bin/ls", "ls","-a", NULL ) == -1 )
{
perror( "execl error " );
exit(1);
}
}
sleep(1);
if( fork() == 0 )
{
printf("2------------execv------------\n");
if( execv( "/bin/ls",arg) < 0)
{
perror("execv error ");
exit(1);
}
}
sleep(1);
if( fork() == 0 )
{
printf("3------------execlp------------\n");
if( execlp( "ls", "ls", "-a", NULL ) < 0 )
{
perror( "execlp error " );
exit(1);
}
}
sleep(1);
if( fork() == 0 )
{
printf("4------------execvp------------\n");
if( execvp( "ls", arg ) < 0 )
{
perror( "execvp error " );
exit( 1 );
}
}
sleep(1);
return 0;
}
system
int system(const char * command)
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
system("ls -al /");
return 0;
}
wait 进程回收
pid_t wait(int *status)
进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。
|