概念了解
- 程序、进程
程序是静态概念,pro文件
进程是程序的一次运行活动 动态 - 查看进程
ps指令//用grep来过滤
比如ps -aux|grep init
也可以用top指令 与任务管理器类似 - 进程标识符
pid 每个进程都有一个非负整数
pid=0:成为交换进程 作用:进程调度
pid=1:init过程 作用:系统初始化
调用getpid来获取 - 父子进程
进程a创建了进程b - c程序的存储空间分配
太麻烦了 不写了 自己了解
bss 正文段 栈 堆 高地址
fork函数
创建进程
fork的俩个返回值的意思:拷贝一份给子进程,一份给父进程,且为子进程pid号。
父进程和子进程互相不影响(全拷贝)
现在为写时拷贝,只有子进程在动手脚是才会复制一份。
fork创建子进程的目的
父子同时执行不同的代码,网络服务进程中应用
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
pid_t pid;
int num;
while(1)
{
printf("please enter a number:");
scanf("%d",&num);
printf("\n");
if(num == 1)
{
pid = fork();
if(pid > 0)
{
printf("i will go\npid is = %d",getpid());
}
else if(pid == 0)
{
printf("my first son will go\npid is = %d",getpid());
}
}
else printf("none!\n");
}
return 0;
}
vfork函数
直接使用父进程存储空间,不拷贝。保证子进程先运行,当子进程调用exit推出后,父进程才执行。
进程退出
1:main调用return
2:进程调用exit(),标准c库
3:进程调用_exit或者_Exit(),属于系统调用
·进程最后一个线程返回
·最后一个线程调用pthread_exit
异常退出:调用abort,最后一个线程对取消(cancellation)请求做出响应。
父进程等待子进程
用wait等待
各种退出码。返回的用wait接受,保存在地址中。
正常退出用WEXITSTATUS(status)。
关于wait:
1:如果其所有子进程还在运行,则阻塞
2:如果一个子进程已终止,正在等待父进程获取其终止状态,则取得该子进程的终止状态立即返回。
3:如果它没有任何子进程,则立即出错返回。
waitpid函数:
这里图有点糊WCONTINUED,WNOHANG,WUNTRACED。
exec族函数
https://blog.youkuaiyun.com/u014530704/article/details/73848573
#include <unistd.h>
extern char **environ;
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
##int execle(const char *path, const char *arg,..., 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[]);
这里有一个函数perror(“why”)
打出错误码
exec配合fork使用:
不想写
system函数
不能执行返回127;失败返回-1;成功返回进程状态值
popen函数
可以获取运行结果相比于system
https://blog.youkuaiyun.com/libinbin_1014/article/details/51490568