提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
上篇:进程(一)
3.ps和kill
ps
查看进程信息
部分参数:
-
a : 显示现行终端机下的所有程序,包括其他用户的程序
-
u: 以用户为主的格式来显示程序状况
-
x: 显示所有程序,不以终端机来区分
-
ajx
kill
向指定的进程发送信号
kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用 SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或job指令查看。
参数:
- -a:当处理当前进程时,不限制命令名和进程号的对应关系;
- -l: <信息编号>:若不加<信息编号>选项,则-l参数会列出全部的信息名称;
- -p:指定kill 命令只打印相关进程的进程号,而不发送任何信号;
- -s <信息名称或编号>:指定要送出的信息;
- -u:指定用户。
4.父子进程间的数据共享
fork之后两个地址空间区数据完全相同
后续各自进行了不同的操作
父进程:num‐‐
子进程:num++
物理地址:num, f_num,z_num
各个进程的地址空间中的数据是完全独立的 ----改变一个另一个的不变
对于同一个变量,读时共享 -----物理地址相同
写的时候分别在物理地址上拷贝一份变量进行单独读写 ----只改变自己的数据(拷贝走的)
父子进程之间可不可以通过全局变量通信? 不能,两个进程内存不能共享
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int i = 200;
int main()
{
pid_t pid;
pid = fork();//>0 return child pid
if(pid == -1)
{
printf("create process failed\n");
return -1;
}
else if(pid > 0)
{
i += 200;
printf("&i = %p,i = %d\n",&i,i);
printf("parent process pid is %d\n",getpid());
}
else if(pid == 0)
{
i += 400;
printf("&i = %p,i = %d\n",&i,i);
printf("child process pid is %d ppid is %d\n",getpid(),getppid());
}
return 0;
}
5.exec函数族
让父子进程来执行不相干的操作 能够替换进程地址空间的代码.text段 执行另外的程序,不需要创建额外的的地址空间 当前程序中调用另外一个应用程序
int execl(const char *path, const char *arg, ...
/* (char *) NULL */);
// 指定执行目录下的程序
/* path : 要执行程序的路径(最好是绝对路径) 变参arg : 要执行的程序需要的参数 第一位arg: 占位 后边的
arg: 命令的参数 参数写完之后:null 一般执行自己写的程序 */
int execlp(const char *file, const char *arg, ...
/* (char *) NULL */);
//执行PATH环境变量能够搜索到的程序
/* file :执行的命令名字 第一个arg:占位 后边的arg:命令的参数 参数写完之后:NULL 执行系统自带的程
序:/bin/xx */ //ps aux
int execle(const char *path, const char *arg, ...
/*, (char *) NULL, char * const envp[] */);
//执行指定路径, 指定环境变量下的程序
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],
char *const envp[]);
返回值:
-
如果函数运行成功不返回
-
如果执行失败,打印错误信息,退出子进程
它们的一般规律如下:
-
l (list) 命令行参数列表
-
p (path) 搜素file时使用path变量
-
v (vector) 使用命令行参数数组
-
e (environment) 使用环境变量数组,不使用进程原有的环境变量,设置新加载程序运行的环境变量