杭州自适应网站建设,网络运营商无服务,水牛影视,建设高端网站的公司1.进程创建fork函数初识 在linux中fork函数时非常重要的函数#xff0c;它从已存在进程中创建一个新进程。新进程为子进程#xff0c;而原进程为父进程。返回值#xff1a;子进程返回0#xff0c;父进程返回子进程id#xff0c;出错返回-1getpid()获取子进程id#xff0c…1.进程创建fork函数初识 在linux中fork函数时非常重要的函数它从已存在进程中创建一个新进程。新进程为子进程而原进程为父进程。 返回值子进程返回0父进程返回子进程id出错返回-1getpid()获取子进程idgetppid()获取父进程id运行程序发现红线的是父进程的pid而黄线的pid是bash进程进程调用fork当控制转移到内核中的fork代码后内核做 分配新的内存块和内核数据结构给子进程 将父进程部分数据结构内容拷贝至子进程 添加子进程到系统进程列表当中 fork返回开始调度器调度 当一个进程调用fork之后就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都将可以 开始它们自己的旅程看如下程序。 这里看到了三行输出一行before两行after。进程28358先打印before消息然后它有打印after。另一个after 消息有28359打印的。注意到进程28359没有打印before为什么呢如下图所示 所以fork之前父进程独立执行fork之后父子两个执行流分别执行。注意fork之后谁先执行完全由调度器 决定。所以第一个After返回的是父进程pid而子进程返回0。 写时拷贝通常父子代码共享父子再不写入时数据也是共享的当任意一方试图写入便以写时拷贝的方式各自一份副 本。具体见下图: 为什么要写时拷贝而不是直接创建进程的时候拷贝一份呢操作系统不允许任何的浪费内存的行为写时拷贝本质是按需申请资源的策略。fork常规用法1.一个父进程希望复制自己使父子进程同时执行不同的代码段。例如父进程等待客户端请求生成子进程来处理请求。2.一个进程要执行一个不同的程序。例如子进程从fork返回后调用exec函数。fork调用失败的原因1.系统中有太多的进程2.实际用户的进程数超过了限制2.进程终止进程退出场景代码运行完毕结果正确 代码运行完毕结果不正确 代码异常终止进程常见退出方法1.正常终止可以通过 echo $? 查看进程退出码 1. 从main返回 2. 调用exit 3. _exit $?只会保留最近一次执行的进程的退出码下面的程序是查看退出码文件strerror函数不是所有的退出码都遵循C语言下面的退出码1 No such processC语言中退出码是32.异常退出 ctrl c信号终止 _exit函数 #include unistd.h
void _exit(int status);
// 参数status 定义了进程的终止状态父进程通过wait来获取该值说明虽然status是int但是仅有低8位可以被父进程所用。所以_exit(-1)时在终端执行$?发现返回值 是255。 exit函数 #include unistd.h
void exit(int status);exit最后也会调用exit, 但在调用exit之前还做了其他工作 1. 执行用户通过atexit或on_exit定义的清理函数。2. 关闭所有打开的流所有的缓存数据均被写入 3. 调用_exit int main()
{printf(hello);exit(0);
}int main()
{printf(hello);_exit(0);
}3.return退出return是一种更常见的退出进程方法。执行return n等同于执行exit(n),因为调用main的运行时函数会将main的返 回值当做 exit的参数。 如何理解进程退出OS内少了一个进程OS就要释放进程对应的内核数据结构代码和数据