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

石家庄网站建设技术支持淘宝客自建手机网站

石家庄网站建设技术支持,淘宝客自建手机网站,聚美优品网的网站建设情况,网站模版asp1. 进程创建 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.hkea.cn/news/14540129/

相关文章:

  • 嘉兴网站制作网络广告策划书案例
  • 成都淮州新城建设投资有限公司网站小小影院 电视剧免费
  • 泉港区住房和城乡规划建设局网站wordpress插件video playe
  • 小题狂做+官方网站王占山将军是什么军衔
  • 网站开发人员需要什么要求gta5买资产网站在建设
  • 对网站建设更新情况的通报我做网站价格
  • 宁波建网站哪家值得信赖酒店网站的规划与建设
  • 如何查看网站的死链接商城版网站建设
  • 湖南响应式网站哪家好南做网站
  • 网站怎么做谷歌推广北京网站设计知名乐云seo
  • 鹰潭门户网站建设费用电商模式有哪几种
  • 网站的建设框架iis网站asp.net部署
  • 做网站下一页400网站推广
  • 网站开发的前后端是什么岳阳公交优化
  • 网站建设规范管理工作站群
  • 临沂手机网站信息推广技术公司电话号码有做二手厨房设备的网站吗
  • 福州网站搜索引擎优化wordpress设计博客
  • 建站平台取名字wordpress 插件哪里
  • cms建站是什么网站建设汇报 安全保障
  • 在哪个网站做失业分解安徽省驻房城乡建设官方网站
  • 银川网站开发公司joomla3.8与wordpress
  • 网站建设86215软件系统网站建设
  • 网站的技术维护一般要做些什么怎样用模块做网站
  • 朝阳网站建设培训新浪邮箱登录入口
  • 网站权限设计简单的网页设计源代码
  • 无锡市住房和城乡建设局网站建设集团工程有限公司
  • 线上问诊网站建设网站怎么做落款
  • 建网站语言打广告去哪个平台免费
  • 企业网站备案信息查询上外国网站用什么dns
  • 万年历网站做通栏网站