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

漳州北京网站建设七牛镜像存储wordpress

漳州北京网站建设,七牛镜像存储wordpress,家谱网站怎么做,佛山手机网站设计制作1. 进程创建 1.1 fork函数 #include unistd.h pid_t fork(void); 返回值#xff1a;自进程中返回0#xff0c;父进程返回子进程id#xff0c;出错返回-1 进程调用fork#xff0c;当控制转移到内核中的fork代码后#xff0c;内核会做以下操作 分配新的内存块和…1. 进程创建 1.1 fork函数 #include unistd.h pid_t fork(void); 返回值自进程中返回0父进程返回子进程id出错返回-1 进程调用fork当控制转移到内核中的fork代码后内核会做以下操作  分配新的内存块和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程添加子进程到系统进程列表当中fork返回开始调度器调度 fork之前父进程独立执行fork之后父子两个执行流分别执行。注意fork之后谁先执行完全由调度器决定。 1.2 写时拷贝 通常父子代码共享父子再不写入时数据也是共享的当任意一方试图写入就以写时拷贝的方式各自一份副本。具体见下图: 1.3 fork常规用法 一个父进程希望复制自己使父子进程同时执行不同的代码段。例如父进程等待客户端请求生成子进程来处理请求。一个进程要执行一个不同的程序。例如子进程从fork返回后调用exec函数。  1.4 fork调用失败的原因 系统中有太多的进程实际用户的进程数超过了限制 2.进程终止 2.1 进程退出场景 正常退出异常退出一个进程只有在正常退出的时候返回值才是有意义的若进程异常退出返回值没有意义 2.2 进程常见退出方法 正常退出 1. 从main返回2. 调用exit3. _exit 2.3 异常退出 收到kill等异常信号执行代码时出现错误操作系统发送信号随后通知的进程 exit函数和_exit函数 #include unistd.h void _exit(int status); void exit(int status); 参数status 定义了进程的终止状态父进程通过wait来获取该值虽然status是int但是仅有低8位可以被父进程所用。所以_exit(-1)时在终端执行$?发现返回值 是255 exit最后也会调用_exit, 但在调用_exit之前还做了其他工作 1. 执行用户通过 atexit或on_exit定义的清理函数。 2. 关闭所有打开的流所有的缓存数据均被写入 3. 调用_exit 2.4 return退出 return是一种更常见的退出进程方法。执行return n等同于执行exit(n),因为调用main的运行时函数会将main的返回值当做 exit的参数。 3. 进程等待 3.1意义 子进程退出父进程如果不管不顾就可能造成‘僵尸进程’的问题进而造成内存泄漏。父进程派给子进程的任务完成的如何我们需要知道。如子进程运行完成结果对还是不对 或者是否正常退出。父进程通过进程等待的方式回收子进程资源获取子进程退出信息 3.2 方法 #includesys/types.h #includesys/wait.h pid_t wait(int*status); 返回值成功返回被等待进程pid失败返回-1。 参数输出型参数获取子进程退出状态,不关心则可以设置成为NULL pid_ t waitpid(pid_t pid, int *status, int options); 返回值当正常返回的时候waitpid返回收集到的子进程的进程ID如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在 参数pidPid-1,等待任一个子进程。与wait等效。Pid0.等待其进程ID与pid相等的子进程。status:WIFEXITED(status): 若为正常终止子进程返回的状态则为真。查看进程是否是正常退出WEXITSTATUS(status): 若WIFEXITED非零提取子进程退出码。查看进程的退出码options:WNOHANG: 若pid指定的子进程没有结束则waitpid()函数返回0不予以等待。若正常结束则返回该子进 程的ID。如果子进程已经退出调用wait/waitpid时wait/waitpid会立即返回并且释放资源获得子进程退出信息。如果在任意时刻调用wait/waitpid子进程存在且正常运行则进程可能阻塞。如果不存在该子进程则立即出错返回。 3.3 获取子进程status wait和waitpid都有一个status参数该参数是一个输出型参数由操作系统填充。 如果传递NULL表示不关心子进程的退出状态信息。 否则操作系统会根据该参数将子进程的退出信息反馈给父进程。 status不能简单的当作整形来看待可以当作位图来看待具体细节如下图只研究status低16比特 位 status解引用后是int型变量占据四个字节的内存空间。但它的四个字节并不是都存储着进程的退出返回值。如图所示我们给每个字节从高地址到低地址依次编号1、2、3、4字节。 一个进程退出的场景只有两个 正常退出和异常退出 3.3.1 位运算法 因此在获取返回值之前先通过低七位判断进程是否正常退出 判断是否正常退出如果status 0x7f 0就能判断一个进程是正常退出,否则就是异常退出解释因为异常退出码占用的是4号字节中的低7位因此我们可以通过(*status)和16进制数(0x7f)进行与运算得到异常退出码。 在判断返回值有意义后取出低16位中的高8位取出方法status 8) 0xff的结果解释我想取出低16位中的高8位需要先将status右移8位随后与1111 1111进行按位与得到结果   因为返回值只用了一个字节保存因此进程的返回值最好不要大于255 3.3.2 宏函数 WIFEXITED(status) 等价于 ( (*status)(0x7f) )0 当异常退出码是0宏函数返回true表示进程的退出返回值有意义 WEXITSTATUS(status) 等价于 ( (*status 8)(0xff) )这样直接就可以得到进程的退出返回值。 二进制十进制十六进制的转换方法 教你快速学会二进制、十进制、十六进制之间的转换 - 知乎 (zhihu.com) #include stdio.h #include unistd.h #include stdlib.h #include sys/wait.h int main() {pid_t pid;pid fork();if (pid 0){printf(%s fork error\n, __FUNCTION__);return 1;}else if (pid 0){ // childprintf(child is run, pid is : %d\n, getpid());sleep(5);exit(1);}else{int status 0;pid_t ret 0;do{ret waitpid(-1, status, WNOHANG); // 非阻塞式等待if (ret 0){printf(child is running, i have some task\n);}sleep(1);} while (ret 0);if (WIFEXITED(status) ret pid){printf(wait child 5s success, child return code is :%d.\n, WEXITSTATUS(status));}else{printf(wait child failed, return.\n);return 1;}}return 0; } 4. 进程的程序替换 4.1 替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数 以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动 例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。 替换函数 其实有六种以exec开头的函数,统称exec函数: #include unistd.h 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 execve(const char *path, char *const argv[], char *const envp[]); 这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。如果调用出错则返回-1所以exec函数只有出错的返回值而没有成功的返回值。 4.2 命名理解 l(list) : 表示参数采用列表 v(vector) : 参数用数组 p(path) : 有p自动搜索环境变量PATH e(env) : 表示自己维护环境变量#include unistd.h int main() {char *const argv[] {ps, -ef, NULL};char *const envp[] {PATH/bin:/usr/bin, TERMconsole, NULL};execl(/bin/ps, ps, -ef, NULL);// 带p的可以使用环境变量PATH无需写全路径execlp(ps, ps, -ef, NULL);// 带e的需要自己组装环境变量execle(ps, ps, -ef, NULL, envp);execv(/bin/ps, argv);// 带p的可以使用环境变量PATH无需写全路径execvp(ps, argv);// 带e的需要自己组装环境变量execve(/bin/ps, argv, envp);exit(0); } 事实上,只有execve是真正的系统调用,其它五个函数最终都调用 execve,所以execve在man手册 第2节,其它函数在 man手册第3节。 5. 制作做一个简易的shell
http://www.zqtcl.cn/news/394413/

相关文章:

  • 园林景观设计网站推荐国内wordpress主题
  • 一流的免费网站建设摄影网站源码
  • 深圳高端网站设计公司怎样开发手机网站建设
  • 做网站需要用c语言吗新闻热点
  • 做网站需要交维护费么网站建设详细合同范本
  • 网站运营需要做什么静态网站作品
  • 如何做旅游休闲网站苍南做网站
  • wordpress jp theme关键词排名优化公司成都
  • Soho外贸常用网站wordpress下不了插件吗
  • 企业网站建设小技巧有哪些WordPress网站小程序
  • 公司招聘网站续费申请seo编辑是干什么的
  • 58同城泉州网站建设人工投票平台app
  • dede 网站地图 插件网站引导页flash
  • 聊城做网站的公司渠道网站总体结构
  • 北京比较大的网站建设公司wap网站引导页特效
  • 做关于植物的网站即墨网站设计
  • 怎么提升网站收录商品网页制作
  • 做网站建设的平台wordpress5.0发布
  • 站长工具a级查网站域名
  • 免费做网站电话手机开发者模式打开有什么影响
  • 上海免费网站建站模板毕节做网站优化
  • 影响网站建设的关键点手机网站制作app
  • 商务网站建设的流程深圳模板网站建设案例
  • 做中英文网站多少钱方维制网站
  • 做一个信息发布网站要多少钱开发小程序多少钱一个
  • 山东网站设计网站关键词设置技巧
  • 做网站服务怎么赚钱产品展示型的网站功能有哪些
  • 丹东网站制作宁波网站建设公司制作网站
  • 南宁建设工程质量网站九江网站建设九江
  • 永州市住房和城乡建设厅网站服务器可以做几个网站