linux 大复习 进程1
进程 是系统分配资源 内存,时间片 的最小单元
数据结构:PCB,代码段,数据段,堆栈段
PCB: 进程控制块 pid 进程状态 优先级 进程动态优先级计数器 家族进程指针
进程调度算法 :
非抢占:FCFS 先来先用,排队思想
抢占 : SJF 最短作业优先 谁快谁先干
HRRN 最高响应比优先法
RR 时间片轮转算法
多级反馈队列 时间片轮换加优先级
进程状态 : 就绪 运行 阻塞
调度/剥夺 io操作
进程 0 号进程 Linux内核 动态库 通过进程
1 号进程 init 第一个 用户进程
创建父子进程
1. 父亲死了,儿子被收养到特定进程 叫做孤儿进程或者守护进程
2.儿子死了,父亲需要清理战场,父亲没有清理 就是僵尸进程
解决方式: 通过wait/waitpid 等待收尸,信号注册
守护进程 daemon( ) //0 改变 1 不改变
具体做了什么 ,父进程搞死 子进程托孤儿给图形进程
改变路径 chdir
改变标准驶入输出错误 dup //dev/null
fork
View Code
View Code
View Code
View Code
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> int main() { pid_t pid =fork(); if(pid == 0) { printf("the son: %d,the father pid : %d \n",getpid(),getppid()); // while(1); // // printf("the son: %d,the father pid : %d \n",getpid(),getppid()); } else if(pid >0) { printf("the father pid : %d \n",getpid()); sleep(1); // pid_t wpid = wait(NULL); int state; pid_t wpid = waitpid(pid,&state,0); printf(" %d\n",wpid); exit(0); } else { perror("fork errno"); exit(0); } return 0; }
vfork
#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<fcntl.h> int mydaemon(int nochdir, int noclose); int main(int argc, char *argv[]) { mydaemon(0,0); //man daemon 可以看到 //0表示改变重定向 1表示不改变 //daemon(1, 1); printf("test ...\n"); for (;;) ; return 0; } int mydaemon(int nochdir, int noclose) { pid_t pid; pid = fork(); if (pid == -1) perror("fork error"); if (pid > 0) exit(0); setsid(); if (nochdir == 0) chdir("/"); if (noclose == 0) { int i; for (i=0; i<3; ++i) close(i); //相当于把0号文件描述符之下/dev/null open("/dev/null", O_RDWR); //fd文件描述符fd-0的文件描述符指向 -16 dup(0); //把0号文件描述符 赋值给空闲的文件描述符 1 dup(0); //把0号文件描述符 赋值给空闲的文件描述符 2 } return 0; }
exec 替换进程印象
用一个进程拉起另一个进程 pid 保持不变 ,但是PCB 代码段,数据段,堆栈段进行替换
//存放的是环境变量
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[]);
首先 第一个参数 是文件 程序 等,第二个 是执行的对应命令以及参数以NULL结尾,顺带着环境变量
exec
#include<stdio.h> #include <sys/types.h> #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[]); */ extern char **environ; int main() { printf("pid :: %d: \n",getpid()); //找到进程 拉起来 // execl("/bin/ls","ls","-lt",NULL); // execlp("./exec","./exec",NULL); int i; for(i=0;environ[i]!=NULL;i++) { printf("%s\n",environ[i]); } return 0; }
hello
#include<stdio.h> #include <sys/types.h> #include <unistd.h> int main() { printf("pid :: %d: \n",getpid()); //execl("./exec","./exec",NULL); //execlp("./exec","./exec",NULL); char * const envp[] = {"aaa=111", "bbb=2222", NULL}; execle("./exec", "./exec",NULL, envp); return 0; }
不摸着石头过河,难道要在温柔乡睡到天昏地暗。