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

建政府网站公司深圳品牌策划公司

建政府网站公司,深圳品牌策划公司,大连seo排名外包,微信小程序麻将辅助免费一. 进程创建 1.fork的概念与使用 在 Linux 中 fork 可以在一个进程中创建一个新的进程。这个新进程称为子进程&#xff0c;原进程为父进程。使用前需要包含头文件 #include <unistd.h> 。在调用 fork 函数时&#xff0c;子进程与父进程会共享数据和代码&#xff0c;此…

一. 进程创建

1.fork的概念与使用

在 Linux 中 fork 可以在一个进程中创建一个新的进程。这个新进程称为子进程,原进程为父进程。使用前需要包含头文件 #include <unistd.h> 。在调用 fork 函数时,子进程与父进程会共享数据和代码,此时它们共用同一块物理地址空间。但当子进程或父进程运行时,对数据进行了修改进行了写入,此时系统将进行写时拷贝,重新给子进程或者父进程申请物理地址。

fork 函数调用时父进程会返回子进程 pid (大于0),子进程会返回0。

二. 进程终止 

进程的退出场景分为三类,第一是代码运行完毕并且结果正确,第二是代码运行完毕但结果不正确,第三是代码运行时异常终止。

在第一种和第二种情况下,我们可以通过退出码来分辨,退出码为0就是结果正确,不为0结果不正确。不同的退出码代表不同的退出状态。

 当我们想查看进程最近一次的退出码时,输入指令 echo $?  可以查看到退出码。

我们通常退出程序时以return exit 或 _exit 结尾终止进程。那么它们直接有什么区别呢?

return 返回通常为函数终止,但不一定代表结束,若在函数中return 返回后程序还会继续运行。而exit 退出则代表程序结束了,此时 exit 会自动执行全局清理。_exit 与 exit 的区别在于 _exit 可以在任意位置结束程序,并且不会对全局进行清理。

int main()
{
printf("hello");
exit(0);
}
运⾏结果:
[root@localhost linux]# ./a.out
hello[root@localhost linux]#int main()
{
printf("hello");
_exit(0);
}
运⾏结果:
[root@localhost linux]# ./a.out
[root@localhost linux]#

 三. 进程等待

在进程中,子进程退出若父进程不进行管理,会导致子进程变成“僵尸进程”,造成内存泄漏。在进程等待中,我们用 wait 和 waitpid 这两个函数。

3.1 wait与waitpid

我们在使用这两个函数前要包含两个头文件。

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

其中status用于储存 wait 中子进程的退出状态,status需要是一个int类型,我们需要将他视作位图,里面会存储进程的退出码,我们也可以传递NULL进去表示不关心退出状态。若子进程成功退出,wait会返回子进程pid,若失败则返回-1。

pid_t waitpid(pid_t pid,int *status,int options)

waitpid 内包含了三个参数,pid,status和options,这里的pid调用的是等待进程的pid,而status与上文一致,options分为阻塞等待和非阻塞等待(下文讲解)。

3.2 阻塞与非阻塞等待

阻塞等待阻塞的是父进程,当父进程处于阻塞状态时,不能进行其他的代码操作,需要一直等待子进程完成任务后得到退出码才能执行自己的代码。而非阻塞等待的父进程可以在等待子进程时,运行父进程的代码,我们可以通过循环的方式,限制多长时间对子进程进行访问是否返回。

通过一个简单的例子说明,我们在等待女友化妆,阻塞等待就是单纯的等女友化完妆,而非阻塞等待意味着,我们可以在女友化妆时做一些其他的事情。

下面是进程阻塞方式的代码:

此时options的参数为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;pid_t ret = waitpid(-1, &status, 0);//阻塞式等待,等待5Sprintf("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;
}运⾏结果:
[root@localhost linux]# ./a.out
child is run, pid is : 45110
this is test for wait
wait child 5s success, child return code is :1.

pid 返回了子进程的pid,并且等待了5秒。

四. 进程程序替换

4.1 替换原理

程序在 fork() 之后,父进程和子进程共用同一份代码(可能执行不同的分支),若我们当前想让子进程独立执行一个全新的程序该如何操作呢?

这里我们会调用一种exec开头的函数,他会将我们子进程的代码进行替换,将需要更换的程序从磁盘里面拷贝下来。他不会产生新的进程,所以子进程的 pid 仍然保持不变,exec 只是对代码段数据段进行了替换。

4.2 替换函数

一共有六中以 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[]);

 4.2.1 execl

execl 参数有 path 和 arg,path 代表要替换程序在磁盘中的文件地址,arg 代表需要替换的功能。

execl("/bin/ls", "ls", "-l", NULL);

在文件 /bin/ls 下 ,调用 ls -l 这一功能,其中要在末尾添加上NULL,代表结束。

4.2.2 execlp

execlp 参数有 file 和 arg,file 可以根据命令查找到对应的文件,例如我们可以将 /bin/ls 文件改为 ls 也能实现同样的功能。后面的 arg 代表要实现的功能。

execlp("ls", "ls", "-l", NULL);

4.2.3 execle

execle 与 execlp 的不同之处在于,它的代表着环境变量 env ,我们在调用时需要自己组装环境变量,当然也可以使用系统环境变量。

我们可以对第三个参数 envp【】自行添加环境变量,例如 { "KEY1=VALUE1","KEY2=VALUE2"};

execle("ls", "ls", "-l", NULL, envp);

4.2.4 execv

我们将 execv 与 execl 进行对比,它们区别在于 “v” 传递的参数为数组,而 “l” 传递的参数为指针。

char *const argv[] = {"ls", "-l", NULL};
execv("/bin/ps", argv);

同样的,在数组最后也要加上NULL表示终止。

4.2.5 execvp

结合上述对函数的解析,这个函数我们不难进行理解,“v” 代表传递的是数组(里面包含相应调用的功能),“p” 代表根据功能找到对应的文件地址。

char *const argv[] = {"ls", "-l", NULL};
execvp("ls", argv);

4.2.6 execve

与 exec 相比多了 “e”和 “v” ,也就是需要添加数组和环境变量数组。

char *const argv[] = {"ls", "-l", NULL};
char *const envp[] = {"PATH=/bin:/usr/bin", "TERM=console", NULL};
execve("/bin/ls", argv, envp);

总结:事实上,在操作系统中真正被调用的只有 execve 这个函数,其他函数都是对其进了封装。因为在 man 手册第二节存在execve ,而其他函数都在man 手册第三节。本质是将 “l” 转化为 “v” 将可变参数报错带数组中,将 “p” 转化为 “e” 将环境变量转化为数组。 

http://www.dtcms.com/wzjs/50429.html

相关文章:

  • 网站建设平台赚钱seo优化培训多少钱
  • 大连网站制作公司博客网站
  • 河北建设厅查询网站公司网站制作公司
  • 深圳做营销网站公司百度站长平台注册
  • 用点心做点心官方网站深圳创新创业大赛
  • 自媒体运营小程序开发网站建设域名注册流程
  • 外贸淘宝网站建设微信公众号推广方法有哪些
  • 如何创建一个国外免费网站线上宣传有哪些好的方式方法
  • 江西建设监督网新网站网站页面优化内容包括哪些
  • 钓鱼网站下载安装灰色广告投放平台
  • 国内疫苗接种率广州宣布5条优化措施
  • 学仿网站seo上首页排名
  • 网站建设制作人员招聘要求百度搜索收录
  • 合肥新站开发区管委会网站企业网站设计与实现论文
  • 网站名称是什么意思兰州网站seo服务
  • 网站网页设计中怎么添加页码信息seo每日一帖
  • 全球疫情实时播报百度关键词优化策略
  • 现在pc网站的标准一般是做多大软文推广代表平台
  • 优秀网站建设报价seo排名软件怎么做
  • 长沙做网站 必看 磐石网络seo自然排名
  • 建设通网站首页百度下载app下载安装到手机
  • o2o网站建设方案宣传推广图片
  • css做网站宽高怎么决定网站优化推广外包
  • wordpress移动自媒体seo关键词优化费用
  • 深州市政府网站河北深州新民居建设网络营销的特点有哪些?
  • 北京建行网站百度官方优化指南
  • 提高网站公信力 单仁做网站哪个公司最好
  • 胡先煦回复秦海璐网页链接seo培训学什么
  • 凡客陈年现状关键词首页排名优化价格
  • 做网站租什么服务器app推广工作靠谱吗