Linux下进程的相关函数和指令
指令
ps —— 查看系统中有哪些进程
ps -aux —— 查看系统中全部进程
ps -aux|grep A —— 查找A进程
top —— 任务管理器界面
getpid函数
获取当前进程的程序标识符
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void); ——获取进程的进程标识符
pid_t getppid(void);——获取父进程的进程标识符
fork函数
从fork()函数开始建立一个进程同原进程一同运行后续指令
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void); —— 建立子进程
fork函数一次调用,两次返回
- 返回值为0 —— 代表当前进程为子进程
- 返回值为非负数 —— 代表当前进程为父进程
- 返回值为-1 —— 调用失败
fork() 函数属于父进程将后续代码拷贝一份给子进程,两进程的数据不互相影响并且同时运行。
vfork() 函数子进程直接使用父进程存储空间,不拷贝,同时保证子进程先运行并退出后,父进程才执行。
-
子进程退出需使用exit()函数正常退出否则会导致数据错乱
- exit(0) —— 程序正常退出
- exit(非零) —— 程序异常退出
wait函数
父进程等待子进程退出,并收集子进程退出状态
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *wstatus);
若子进程比父进程先结束,而父进程未调用wait()函数收集子进程状态,则子进程变为僵尸进程
- 僵尸进程将会占用系统内进程号,如果产生大量僵尸进程则会因为没有进程号无法创造新进程
若父进程比子进程先结束,子进程变为孤儿进程,将由init(pid = 1)来收留
使用WEXITSTATUS()来解析通过wait()得到的子进程传回来的状态
exec函数
在进程中调用可执行文件,调用成功后不执行后续进程
#include <unistd.h>
int execl(const char *path, const char *arg, const char *arg... /* (char *) NULL */);
-
内容解析
- const char *path —— 想要执行文件的路径 - const char *arg —— 可执行文件名 - ... —— 执行文件所需要的参数 - (char *) NULL —— 结尾必须以NULL结束
如 execl("/bin/ls",“ls”,"-l",NULL);
perror()函数:查看错误原因
system函数
在进程中调用可执行文件,调用成功后继续执行后续进程
#include <stdlib.h>
int system(const char *command);
- 返回值为进程的状态值 —— 成功
- 返回值为127 —— sh不能执行
- 返回值为-1 —— 失败
popen函数
调用可执行文件,并可以记录下调用的数据
#include <stdio.h>
FILE *popen(const char *command, const char *type);
-
内容解析
- const char *command —— 可执行文件名
- const char *type —— 读写类型- “r” —— 连接到 command 的标准输出
- “w” —— 连接到 command 的标准输入
配合使用fread()函数可将执行的数据记录下来,如下
char ret[1024] = {0};
FILE *fp;
fp = popen("ps","r");
fread(ret,1,1024,fp);