阿里巴巴国际站开店流程及费用我想建立一个网站不知道怎么做啊

当前位置: 首页 > news >正文

阿里巴巴国际站开店流程及费用,我想建立一个网站不知道怎么做啊,科技资讯 哪个网站好,上海100强企业排名目录 1 复习目标 2 进程相关概念 2.2 并行和并发 2.3 PCB-进程控制块
2.4 进程状态(面试考) 3 创建进程 3.2 ps命令和kill命令 3.3 getpid/getppid 3.4 练习题 4 exec函数族 4.1 函数作用和函数介绍 4.1.1 execl函数 4.1.2 execlp函数 4.2 exec函数族原理介绍 4.3 …目录 1 复习目标 2 进程相关概念 2.2 并行和并发 2.3 PCB-进程控制块  2.4 进程状态(面试考) 3 创建进程 3.2 ps命令和kill命令 3.3 getpid/getppid 3.4 练习题 4 exec函数族 4.1 函数作用和函数介绍 4.1.1 execl函数 4.1.2 execlp函数 4.2 exec函数族原理介绍 4.3 exec函数练习 5 进程回收 5.1 为什么要进行进程资源的回收 5.2 孤儿进程 5.3 僵尸进程 5.4 进程回收函数 5.4.1 wait函数 5.4.2waitpid函数 6 作业 6.1 作业1 6.2 作业2 7 大纲 1 复习目标 了解进程相关的概念掌握fork/getpid/getppid函数的使用熟练掌握ps/kill命令的使用熟练掌握execl/execlp函数的使用说出什么是孤儿进程什么是僵尸进程熟练掌握wait函数的使用熟练掌握waitpid函数的使用 2 进程相关概念 程序是指编译好的二进制文件在磁盘上占用磁盘空间, 是一个静态的概念.进程一个启动的程序 进程占用的是系统资源如物理内存CPU终端等是一个动态的概念程序 → 剧本(纸)进程 → 戏(舞台、演员、灯光、道具…) 同一个剧本可以在多个舞台同时上演。同样同一个程序也可以加载为不同的进程(彼此之间互不影响) 2.2 并行和并发 并发在一个时间段内, 是在同一个cpu上, 同时运行多个程序。 如若将CPU的1S的时间分成1000个时间片每个进程执行完一个时间片必须无条件让出CPU的使用权这样1S中就可以执行1000个进程。 并行性指两个或两个以上的程序在同一时刻发生(需要有多颗)。 2.3 PCB-进程控制块  每个进程在内核中都有一个进程控制块PCB来维护进程相关的信息Linux内核的进程控制块是task_struct结构体。 /usr/src/linux-headers-4.4.0-96/include/linux/sched.h文件的1390行处可以查看struct task_struct 结构体定义。其内部成员有很多我们重点掌握以下部分即可 进程id。系统中每个进程有唯一的id在C语言中用pid_t类型表示其实就是一个非负整数。进程的状态有就绪、运行、挂起、停止等状态。进程切换时需要保存和恢复的一些CPU寄存器。描述虚拟地址空间的信息。描述控制终端的信息。当前工作目录Current Working Directory。getcwd –pwdumask掩码。文件描述符表包含很多指向file结构体的指针。和信号相关的信息用户id和组id。会话Session和进程组。进程可以使用的资源上限Resource Limit。 ulimit -a 2.4 进程状态(面试考) 进程基本的状态有5种。分别为初始态就绪态运行态挂起态与终止态。其中初始态为进程准备阶段常与就绪态结合来看。 3 创建进程 3.1 fork函数 函数作用创建子进程 原型: pid_t fork(void); 函数参数无 返回值调用成功:父进程返回子进程的PID子进程返回0 调用失败:返回-1设置errno值。 fork函数代码片段实例 fork函数总结 ►fork函数的返回值 父进程返回子进程的PID是一个大于0数; 子进程返回0 特别需要注意的是不是fork函数在一个进程中返回2个值而是在父子进程各自返回一个值。 ►子进程创建成功后代码的执行位置 父进程执行到什么位置子进程就从哪里执行 ►如何区分父子进程 通过fork函数的返回值 ►父子进程的执行顺序 不一定哪个进程先抢到CPU哪个进程就先执行 3.2 ps命令和kill命令 ps aux | grep xxxps ajx | grep xxx -aall当前系统所有用户的进程-u查看进程所有者及其他一些信息-x显示没有控制终端的进程 – 不能与用户进行交互的进程【输入、输出】-j: 列出与作业控制相关的信息 kill -l 查看系统有哪些信号kill -9 pid 杀死某个线程 3.3 getpid/getppid getpid - 得到当前进程的PID pid_t getpid(void); getppid - 得到当前进程的父进程的PID pid_t getppid(void); //fork函数测试 #include stdio.h #include stdlib.h #include string.h #include sys/types.h #include unistd.hint main() {printf(before fork, pid:[%d]\n, getpid());//创建子进程//pid_t fork(void);pid_t pid fork();if(pid0) //fork失败的情况{perror(fork error);return -1;}else if(pid0)//父进程{printf(father: [%d], pid[%d], fpid[%d]\n, pid, getpid(),getppid());//sleep(1);}else if(pid0) //子进程{printf(child: pid[%d], fpid[%d]\n, getpid(), getppid());}printf(after fork, pid:[%d]\n, getpid());return 0; }3.4 练习题 1编写程序循环创建多个子进程要求如下 多个子进程是兄弟关系。 判断子进程是第几个子进程 画图讲解创建多个子进程遇到的问题 注意若让多个子进程都是兄弟进程必须不能让子进程再去创建新的子进程。 //fork函数测试 #include stdio.h #include stdlib.h #include string.h #include sys/types.h #include unistd.h int g_var 99;int main() {//创建子进程pid_t pid fork();if(pid0) //fork失败的情况{perror(fork error);return -1;}else if(pid0)//父进程{printf(father: [%d], pid[%d], fpid[%d]\n, pid, getpid(),getppid());g_var;printf([%p], g_var);}else if(pid0) //子进程{sleep(1); //为了避免父进程还没有执行, 子进程已经结束了printf([%p], g_var);printf(child: pid[%d], fpid[%d]\n, getpid(), getppid());printf(child: g_var[%d]\n, g_var);}return 0; }2.编写程序测试父子进程是否能够共享全局变量 重点通过这个案例讲解读时共享写时复制 //循环创建n个子进程 #include stdio.h #include stdlib.h #include string.h #include sys/types.h #include unistd.hint main() {int i 0;for(i0; i3; i){//创建子进程pid_t pid fork();if(pid0) //fork失败的情况{perror(fork error);return -1;}else if(pid0)//父进程{printf(father: pid[%d], fpid[%d]\n, getpid(),getppid());//sleep(1);}else if(pid0) //子进程{printf(child: pid[%d], fpid[%d]\n, getpid(), getppid());break;}}//第1个子进程if(i0){printf([%d]–[%d]: child\n, i, getpid()); }//第2个子进程if(i1){printf([%d]–[%d]: child\n, i, getpid()); }//第3个子进程if(i2){printf([%d]–[%d]: child\n, i, getpid()); }//父进程if(i3){printf([%d]–[%d]: child\n, i, getpid()); }sleep(10);return 0; }4 exec函数族 4.1 函数作用和函数介绍 有的时候需要在一个进程里面执行其他的命令或者是用户自定义的应用程序此时就用到了exec函数族当中的函数。使用方法一般都是在父进程里面调用fork创建处子进程然后在子进程里面调用exec函数。 4.1.1 execl函数 函数原型: int execl(const char *path, const char arg, … / (char  *) NULL */); 参数介绍 path: 要执行的程序的绝对路径变参arg: 要执行的程序的需要的参数arg:占位通常写应用程序的名字arg后面的: 命令的参数参数写完之后: NULL 返回值若是成功则不返回不会再执行exec函数后面的代码若是失败会执行execl后面的代码可以用perror打印错误原因。 execl函数一般执行自己写的程序。 4.1.2 execlp函数 函数原型: int execlp(const char *file, const char arg, …/ (char  *) NULL */); 参数介绍 file: 执行命令的名字, 根据PATH环境变量来搜索该命令arg:占位arg后面的: 命令的参数参数写完之后: NULL 返回值若是成功则不返回不会再执行exec函数后面的代码若是失败会执行exec后面的代码可以用perror打印错误原因。 execlp函数一般是执行系统自带的程序或者是命令. 4.2 exec函数族原理介绍 exec族函数的实现原理图 如execlp(“ls”, “ls”, “-l”, NULL) 总结 exec函数是用一个新程序替换了当前进程的代码段、数据段、堆和栈原有的进程空间没有发生变化并没有创建新的进程进程PID没有发生变化。 4.3 exec函数练习
使用execl函数执行一个用户自定义的应用程序使用execlp函数执行一个linux系统命令 注意当execl和execlp函数执行成功后不返回并且不会执行execl后面的代码逻辑原因是调用execl函数成功以后exec函数指定的代码段已经将原有的代码段替换了。 5 进程回收 5.1 为什么要进行进程资源的回收 当一个进程退出之后进程能够回收自己的用户区的资源但是不能回收内核空间的PCB资源必须由它的父进程调用wait或者waitpid函数完成对子进程的回收避免造成系统资源的浪费。 5.2 孤儿进程 孤儿进程的概念 若子进程的父进程已经死掉而子进程还存活着这个进程就成了孤儿进程。 为了保证每个进程都有一个父进程孤儿进程会被init进程领养init进程成为了孤儿进程的养父进程当孤儿进程退出之后由init进程完成对孤儿进程的回收。模拟孤儿进程的案例 编写模拟孤儿进程的代码讲解孤儿进程验证孤儿进程的父进程是否由原来的父进程变成了init进程。 //孤儿进程 #include stdio.h #include stdlib.h #include string.h #include sys/types.h #include unistd.hint main() {//创建子进程pid_t pid fork();if(pid0) //fork失败的情况{perror(fork error);return -1;}else if(pid0)//父进程{sleep(5);printf(father: [%d], pid[%d], fpid[%d]\n, pid, getpid(),getppid());}else if(pid0) //子进程{printf(child: pid[%d], fpid[%d]\n, getpid(), getppid());sleep(20);printf(child: pid[%d], fpid[%d]\n, getpid(), getppid());}return 0; }5.3 僵尸进程 僵尸进程的概念: 若子进程死了父进程还活着 但是父进程没有调用wait或waitpid函数完成对子进程的回收则该子进程就成了僵尸进程。 如何解决僵尸进程 由于僵尸进程是一个已经死亡的进程所以不能使用kill命令将其杀死通过杀死其父进程的方法可以消除僵尸进程。 杀死其父进程后这个僵尸进程会被init进程领养由init进程完成对僵尸进程的回收。 模拟僵尸进程的案例 编写模拟僵尸进程的代码讲解僵尸进程, 验证若子进程先于父进程退出, 而父进程没有调用wait或者waitpid函数进行回收, 从而使子进程成为了僵尸进程. //僵尸进程 #include stdio.h #include stdlib.h #include string.h #include sys/types.h #include unistd.hint main() {//创建子进程pid_t pid fork();if(pid0) //fork失败的情况{perror(fork error);return -1;}else if(pid0)//父进程{sleep(100);printf(father: [%d], pid[%d], fpid[%d]\n, pid, getpid(),getppid());}else if(pid0) //子进程{printf(child: pid[%d], fpid[%d]\n, getpid(), getppid());}return 0; }5.4 进程回收函数 5.4.1 wait函数 函数原型 pid_t wait(int *status); 函数作用 阻塞并等待子进程退出 回收子进程残留资源 获取子进程结束状态(退出原因)。 返回值 成功清理掉的子进程ID失败-1 (没有子进程) status参数子进程的退出状态 – 传出参数 WIFEXITED(status)为非0        → 进程正常结束 WEXITSTATUS(status)获取进程退出状态 WIFSIGNALED(status)为非0 → 进程异常终止 WTERMSIG(status)取得进程终止的信号编号。 wait函数练习 使用wait函数完成父进程对子进程的回收。 //父进程调用wait函数完成对子进程的回收 #include stdio.h #include stdlib.h #include string.h #include sys/types.h #include unistd.h #include sys/wait.hint main() {//创建子进程pid_t pid fork();if(pid0) //fork失败的情况{perror(fork error);return -1;}else if(pid0)//父进程{printf(father: [%d], pid[%d], fpid[%d]\n, pid, getpid(),getppid());int status;pid_t wpid wait(status);printf(wpid[%d]\n, wpid);if(WIFEXITED(status)) //正常退出{printf(child normal exit, status[%d]\n, WEXITSTATUS(status));}else if(WIFSIGNALED(status)) //被信号杀死{printf(child killed by signal, signo[%d]\n, WTERMSIG(status));}}else if(pid0) //子进程{printf(child: pid[%d], fpid[%d]\n, getpid(), getppid());sleep(20);return 9;}return 0; }5.4.2waitpid函数 函数原型 pid_t waitpid(pid_t pid, int *status, in options); 函数作用 同wait函数 函数参数 参数 pid pid -1 等待任一子进程。与wait等效。 pid 0 等待其进程ID与pid相等的子进程。 pid 0 等待进程组ID与目前进程相同的任何子进程也就是说任何和调用 waitpid()函数的进程在同一个进程组的进程。 pid -1 等待其组ID等于pid的绝对值的任一子进程。(适用于子进程在其他组的情况) status: 子进程的退出状态用法同wait函数。 options设置为WNOHANG函数非阻塞设置为0函数阻塞。 函数返回值 0返回回收掉的子进程ID -1无子进程 0参3为WNOHANG且子进程正在运行。 waitpid函数练习 使用waitpid函数完成对子进程的回收 6 作业 6.1 作业1 测试父子进程之间是否共享文件 6.2 作业2 父进程fork三个子进程:
其中一个调用ps命令; 一个调用自定义应用程序; 一个调用会出现段错误的程序。 父进程回收三个子进程(waitpid)并且打印三个子进程的退出状态。 段错误

  1. 访问了非法内存
  2. 访问了不可写的区域进行写操作
  3. 栈空间溢出 char* p “helloworld”         p【0】‘a’ 7 大纲 程序和进程的概念:     程序: 是编译好的二进制文件, 存放在磁盘上, 占用的是磁盘空间, 是一个静态的概念.     进程: 一个启动的程序, 需要占用系统资源: 如 内存, cpu 终端 等     剧本—程序     进程—唱戏(舞台, 灯光, 道具, 人等资源)     同一个程序可以在多个终端执行, 类似与同一台戏可以在多个舞台演出.     没启动一个程序都会有一个进程PID, 即使是相同的程序多次启动也会有个不同的PID. 并行和并发的概念:     并发: 在一个时间段内, 一个CPU上, 有多个程序在执行.     并行: 在一个时间片内, 有多个程序在执行(前提是有多个cpu)     cpu会将一个大的时间段分成多个小的时间片, 让进程轮流使用CPU的时间片. 父子进程不能共享全局变量. 如果想在一个进程内部执行系统命令或者是应用程序, 优先应该想到如下方式: 先fork(), 然后在子进程里面执行execl拉起可执行程序或者命令. pid fork(); if(pid0) {     execl(…); } execl: 一般用于执行用户自定义的应用程序. execp: 一般用于执行系统命令 孤儿进程: 父进程先退出, 子进程就变成了孤儿进程, 此时被init进程领养,           当孤儿进程退出之后, 就会被init进程回收.            僵尸进程: 子进程先退出, 父进程没有完成对子进程的回收, 此时子进程就变成了僵尸进程. 如何解决僵尸进程:     不能使用kill -9杀死僵尸进程, 原因是僵尸进程是一个死掉的进程;     应该使用杀死僵尸进程父进程的方法来解决僵尸进程;     原因是: 杀死其父进程可以让init进程领养僵尸进程,最后由init进程回收僵尸进程.      wait函数:     pid_t wait(int *status);     返回值:         0: 回收的子进程的PID         -1: 没有子进程     参数:         status: 子进程的退出状态             if(WIFEXITED(status))             {                 WEXITSTATUS(status)             }             else if(WIFSIGNALED(status))             {                 WTERMSIG(status)             }