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

广告设计与制作专业专升本百度快照优化seo

广告设计与制作专业专升本,百度快照优化seo,苹果软件做ppt下载网站有哪些内容吗,中国最大的新闻网站进程创建 在Linux中我们使用fork函数创建新进程: fork函数 fork函数是Linux中的一个系统调用,用于创建一个新的进程,创建的新进程是原来进程的子进程 返回值:如果子进程创建失败,返回值是-1。如果子进程创建成功&a…

进程创建

在Linux中我们使用fork函数创建新进程:

fork函数

fork函数是Linux中的一个系统调用,用于创建一个新的进程,创建的新进程是原来进程的子进程

返回值:如果子进程创建失败,返回值是-1。如果子进程创建成功,对于父进程而言,fork的返回值是子进程的pid(子进程的进程号);对于子进程而言,fork的返回值是0。

让父子进程分别打印fork函数的返回值和自己的PID:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main()
{pid_t pid;      //parent_idpid_t cid;      //child_pidprintf("Before fork Process id: %d\n", getpid());cid = fork();printf("After fork, Process id: %d\n", getpid());printf("fork_function return: %d\n", cid);sleep(5);return 0;
}

实验结果:

调用fork后,内核中的fork代码会执行:

• 分配新的内存块和内核数据结构给⼦进程

• 将⽗进程部分数据结构内容拷⻉⾄⼦进程

• 将⼦进程添加到系统进程列表当中

• fork返回,调度器开始调度

子进程被创建好后,父子进程会并发执行后续代码

父子进程内存空间独立

上文说到,fork函数会把父进程的代码和数据拷贝给子进程,以此来保证进程之间的独立性,但实际上,为了节省内存空间和提高运行效率,只有当子进程的代码和数据发生变化时,才会为子进程开辟一块内存空间,并将父进程的代码和数据拷贝给子进程,这被称为写时拷贝

而在写时拷贝之前,父子进程的虚拟地址相同,并且通过页表映射后指向同一处物理地址

而在写时拷贝之后,父子进程的虚拟地址仍然相同,只是会映射到不同的物理地址

进程终止

进程终⽌的本质是释放进程申请的相关内核数据结构和对应的数据和代码。

进程退出的三种情况:

1.代码运⾏完毕,结果正确

2.代码运⾏完毕,结果不正确

3. 代码异常终⽌

为了判断进程终止是哪种情况,进程在结束时会将退出码和退出信号返回给父进程,其中,退出信号用于判断进程是否异常,退出码用于判断进程运行结果是否正确

如何获取退出码和退出信号,我们在进程等待部分再做介绍,这里先介绍常见的退出码:

可以使⽤strerror函数来获取退出码对应的描述。

返回不同的退出码:

1.使用 return n

2.使用void exit(int status)或void _exit(int status),二者区别如下:

return n和exit(n)等效

进程等待

进程等待的目的:

1.检查子进程的任务执行

2.避免产生僵尸进程

进程等待的方法

wait函数

#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int* status);

返回值:

成功返回被等待进程 pid ,失败返回-1 。

参数:

status:输出型参数,获取⼦进程退出码 , 不关⼼则可以设置成为 NULL

一个父进程可能有多个子进程,而wait函数等待的是任意子进程

因此,推荐使用waitpid函数:

 pid_ t waitpid(pid_t pid, int *status, int options);

返回值:

当正常返回的时候 waitpid 返回收集到的⼦进程的进程 ID ;

如果设置了选项 WNOHANG, ⽽调⽤中 waitpid 发现没有已退出的⼦进程可收集 , 则返回 0 ;

如果调⽤中出错 , 则返回-1, 这时 errno 会被设置成相应的值以指⽰错误所在;

参数:

pid :

Pid=-1, 等待任⼀个⼦进程。与 wait 等效。

Pid>0. 等待其进程 ID 与 pid 相等的⼦进程。

status: 输出型参数,为了便于调用,可以使用以下两个宏:

WIFEXITED(status): 若为正常终⽌⼦进程返回的状态,则为真。(查看进程是否是正常退出) WEXITSTATUS(status): 若 WIFEXITED ⾮零,提取⼦进程退出码。(查看进程的退出码)

options:

默认为 0 ,表⽰阻塞等待

WNOHANG: 非阻塞等待,若 pid 指定的⼦进程没有结束,则 waitpid() 函数返回 0 ,不予等待。若正常结束,则返回该⼦进程的 ID 。

status

status用于记录子进程的退出信号和退出码:

前7位为退出信号,第8位为core dump标志(不关心),9~16位为退出码

若退出信号非0,表明进程异常

若退出信号为0,表明进程正常运行

若退出码非0,表明运行结果错误

若退出码非0,表明运行结果正常

阻塞等待与非阻塞轮询等待对比

阻塞等待:

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(257);} else{int status = 0;pd_t ret = waitpid(-1, &status, 0);//阻塞式等待,等待5S printf("this is test for wait\n");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;}

父进程阻塞等待成功

虽然返回的是257,但由于退出码只取8位,所以返回1:

非阻塞轮询等待:

void handler() {printf("临时任务\n");sleep(1);}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\n");}handler();} 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;}

可以看到父进程一边执行自己的“临时任务”,一边询问子进程是否结束,直到子进程结束,等待结束:

进程替换

我们之前虽然用fork创建了子进程,但是子进程和父进程执行的还是同样的代码,很多时候我们创建子进程就是为了去专门执行某一任务,这就需要用到进程替换,进程替换是通过特定的接⼝,把磁盘上另外的⼀个程序的代码和数据加载到调⽤原先进程的地址空间中。

替换原理

⽤fork创建⼦进程后执⾏的是和⽗进程相同的程序(但有可能执⾏不同的代码分⽀),⼦进程往往要调⽤⼀种exec函数以执⾏另⼀个程序。当进程调⽤⼀种exec函数时,该进程的⽤⼾空间代码和数据完全被新程序替换,从新程序的启动例程开始执⾏。调⽤exec并不创建新进程,所以调⽤exec前后该进程的id并未改变。

替换函数

#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 

这里把子进程替换为一个能够读入并执行命令的程序:

#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h> 
int main(int argc, char* argv[])
{pid_t id=fork();if(id==0){     char**  myargv=&argv[1];                                                                                                                                                    execvp(myargv[0],myargv);}waitpid(id,NULL,0);return 0;
}

可以看到子进程可以收集并执行命令

http://www.cadmedia.cn/news/10367.html

相关文章:

  • 保健品网站建设案例b2b关键词排名工具
  • 山西省建筑工程网广州网站优化平台
  • 知舟网站建设徐州seo顾问
  • 请简述网站建设的方法百度竞价排名一年费用
  • 中国建设网官网网站百度一下官方网页
  • 定制型网站建设推广杭州排名优化公司电话
  • 宁波专业做网站站长工具下载app
  • 网页制作教程视频简单seo关键词选取工具
  • 天津高端网站建设案例怎么创建网站
  • 网站建设公司推荐 金石下拉新媒体运营岗位职责
  • 张家港网站建设模板网络外包运营公司
  • 政府类网站建设费用益阳网站seo
  • 如何做电商网站设计百度客户服务电话
  • 记政府网站建设游戏推广公司
  • 河北企业网站制作百度seo怎么操作
  • 水平b2电子商务网站企业专业搜索引擎优化
  • 孝感网站开发公司正规seo排名多少钱
  • 装修网站官网关键词优化策略有哪些
  • 静态网站结构如何更新百度搜索排名怎么做
  • 提供企业网站建设价格网络推广与营销
  • 锦州网站seo标题优化怎么做
  • 网站升级改版福州seo快速排名软件
  • 屋领网站固链营销推广费用预算表
  • 网站建设 开发自媒体人15种赚钱方法
  • 网站模板首页万网域名管理平台
  • 人大网站建设要领导重视宁波seo优化外包公司
  • 网站推广优化方法怎么交换友情链接
  • 服装官网网站建设手机360优化大师官网
  • 东莞做网站it s百度域名收录提交入口
  • 网站空间什么意思怎样建立一个网络销售平台