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

洛阳建公司网站温州seo招聘

洛阳建公司网站,温州seo招聘,武进网站建设价位,工厂代加工平台一、进程创建 1.1 认识fork函数 在linux中fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。 进程调用fork,当控制转移到内核中的fork代码后,内核将 分配新的内存块和内核数据结构…

一、进程创建

1.1 认识fork函数

在linux中fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。
在这里插入图片描述

进程调用fork,当控制转移到内核中的fork代码后,内核将

  1. 分配新的内存块和内核数据结构给子进程
  2. 将父进程部分数据结构内容拷贝至子进程
  3. 添加子进程到系统进程列表当中
  4. fork返回,开始调度器调度
    在这里插入图片描述

1.2 写时拷贝

通常,父子代码共享,父子在不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副
本。具体见下图:
在这里插入图片描述
其实,我们使用fork()函数创建子进程时,操作系统会将父进程数据权限置为只读。后续当我们想要向子进程写入时,首先会触发系统错误,引起缺页中断,而后操作系统就会进行检测,当判断为该数据是可写入时发生写时拷贝。
进行写时拷贝时,首先会向操作系统申请内存空间进行拷贝,然后修改页表对应的物理内存,最后将读写权限恢复即可。整个过程都是由操作系统自主实现的。

二、进程终止

前面我们有谈到过,当进程退出时会返回父进程或操作系统一个退出码。我们可以使用$?来查看最近一个进程的退出码,用0表示正常退出,非零表示各种各样的退出原因(可以自己设置)。

2.1 进程终止的方式

main函数返回

#include<stdio.h>void func()
{printf("Hello World!\n");
}int main()
{func();return 0;
}
[caryon@VM-24-10-centos lesson16]$ ./code
Hello World!
[caryon@VM-24-10-centos lesson16]$ echo $?
0

调用exit

#include<stdio.h>
#include<stdlib.h>void func()
{printf("Hello World!\n");exit(100);
}int main()
{func();printf("process is done!\n");return 0;
}
[caryon@VM-24-10-centos lesson16]$ ./code
Hello World!
[caryon@VM-24-10-centos lesson16]$ echo $?
100

调用_exit

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
void func()
{printf("Hello World!\n");_exit(100);
}int main()
{func();printf("process is done!\n");return 0;
}
[caryon@VM-24-10-centos lesson16]$ ./code
Hello World!
[caryon@VM-24-10-centos lesson16]$ echo $?
100

Ctrl+c
这个我们很常用了,就不多赘述了。

exit和_exit有什么区别?
我们通过一个小实验发现exit会将缓冲区刷新,而_exit则不会。
这一点区别也与他们的特性有关:_exit是系统调用接口,而exit是对_exit和输出缓冲区的封装。这一点也正好的说明了缓冲区不是系统层的概念,而是语言层的概念,缓冲区一定不在操作系统上。

三、进程等待

3.1 为什么要有进程等待

  • 之前的博客讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。
  • 另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程。
  • 最后,父进程派给子进程的任务完成的如何,我们需要知道。如,子进程运行完成,结果对还是不对,或者是否正常退出。
  • 父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息

3.2 进程等待的方法

在这里插入图片描述

wait

#include<sys/types.h>
#include<sys/wait.h>pid_t wait(int* status);//返回值:
//	 成功返回被等待进程pid,失败返回-1。
//参数:
//	 输出型参数,获取子进程退出状态,不关心则可以设置成为NULL

这个函数用以让父进程等待任意一个子进程结束,等待的时候,子进程不退,父进程就要阻塞在wait函数内部。
可以回收僵尸状态的子进程。

实例:

#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>void Worker()
{int cnt =10;while (cnt--){printf("I am child process, pid: %d, ppid: %d, cnt: %d\n", getpid(), getppid(), cnt);sleep(1);}
}int main()
{pid_t id = fork();if (id == 0){// childWorker();exit(0);}else{// fatherpid_t rid = wait(NULL);if (rid > 0)printf("wait success\n");else if(rid == -1)printf("wait fail\n");while(1){printf("haha\n");sleep(1);}}return 0;
}
[caryon@VM-24-10-centos ~]$ ps axj |head -1 ;ps axj |grep code |grep -v grepPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
30280 16225 16225 30280 pts/0    16225 S+    1001   0:00 ./code
16225 16226 16225 30280 pts/0    16225 S+    1001   0:00 ./code
[caryon@VM-24-10-centos ~]$ ps axj |head -1 ;ps axj |grep code |grep -v grepPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
30280 16225 16225 30280 pts/0    16225 S+    1001   0:00 ./code
I am child process, pid: 16226, ppid: 16225, cnt: 9
I am child process, pid: 16226, ppid: 16225, cnt: 8
I am child process, pid: 16226, ppid: 16225, cnt: 7
I am child process, pid: 16226, ppid: 16225, cnt: 6
I am child process, pid: 16226, ppid: 16225, cnt: 5
I am child process, pid: 16226, ppid: 16225, cnt: 4
I am child process, pid: 16226, ppid: 16225, cnt: 3
I am child process, pid: 16226, ppid: 16225, cnt: 2
I am child process, pid: 16226, ppid: 16225, cnt: 1
I am child process, pid: 16226, ppid: 16225, cnt: 0
wait success
haha
haha
haha

waitpid

#include<sys/types.h>
#include<sys/wait.h>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:
//	 	WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进程的ID。

这个函数与上述函数可以不同,它可以设置是否为阻塞等待,只需要将options置为非零就可以实现非阻塞等待。
实例

#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>void Worker()
{int cnt =10;while (cnt--){printf("I am child process, pid: %d, ppid: %d, cnt: %d\n", getpid(), getppid(), cnt);sleep(1);}
}int main()
{pid_t id = fork();if (id == 0){// childWorker();exit(0);}else{// fatherpid_t rid = waitpid(-1,NULL,WNOHANG);if (rid > 0)printf("wait success\n");else if(rid == -1)printf("wait fail\n");while(1){printf("haha\n");sleep(1);}}return 0;
}
[caryon@VM-24-10-centos ~]$ ps axj |head -1 ;ps axj |grep code |grep -v grepPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
30280 20747 20747 30280 pts/0    20747 S+    1001   0:00 ./code
20747 20748 20747 30280 pts/0    20747 S+    1001   0:00 ./code
[caryon@VM-24-10-centos ~]$ ps axj |head -1 ;ps axj |grep code |grep -v grepPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
30280 20747 20747 30280 pts/0    20747 S+    1001   0:00 ./code
haha
I am child process, pid: 20748, ppid: 20747, cnt: 9
haha
I am child process, pid: 20748, ppid: 20747, cnt: 8
haha
I am child process, pid: 20748, ppid: 20747, cnt: 7
I am child process, pid: 20748, ppid: 20747, cnt: 6
haha
haha
I am child process, pid: 20748, ppid: 20747, cnt: 5
haha
I am child process, pid: 20748, ppid: 20747, cnt: 4
haha
I am child process, pid: 20748, ppid: 20747, cnt: 3
haha
I am child process, pid: 20748, ppid: 20747, cnt: 2
I am child process, pid: 20748, ppid: 20747, cnt: 1
haha
haha

非阻塞等待状态就允许父进程干自己的事情。

3.3 获取子进程的status

  • wait和waitpid,都有一个status参数,该参数是一个输出型参数,由操作系统填充。
  • 如果传递NULL,表示不关心子进程的退出状态信息。否则,操作系统会根据该参数,将子进程的退出信息反馈给父进程。
  • status不能简单的当作整形来看待,可以当作位图来看待,具体细节如下图(status的低16位用以表示退出信息,其中该16位的高8位用以存储退出状态信息,低7位用以存储终止信号信息):
    在这里插入图片描述

实例:

#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>int main()
{pid_t pid = fork();if (pid < 0)perror("fork"),exit(1);if ( pid == 0 ){sleep(20);exit(10);} else {int st;int ret = wait(&st);if ( ret > 0 && ( st & 0X7F ) == 0 ){ // 正常退出printf("child exit code:%d\n", (st>>8)&0XFF);} else if( ret > 0 ) { // 异常退出printf("sig code : %d\n", st&0X7F );}}
}

四、进程程序替换

4.1 替换原理

用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。
在这里插入图片描述

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[]);//这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。
//如果调用出错则返回-1
//所以exec函数只有出错的返回值而没有成功的返回值。

这些函数看似很多,但是我们掌握了规律就好记了:

  • l(list) : 表示参数采用列表
  • v(vector) : 参数用数组
  • p(path) : 有p自动搜索环境变量PATH
  • e(env) : 表示自己维护环境变量

单进程的例子

#include <stdio.h>
#include <unistd.h>int main()
{execl("/usr/bin/ls","-l","-a",NULL);return 0;
}
[caryon@VM-24-10-centos linux]$ ./code
.   code    .git      lesson11	lesson13  lesson15  lesson2  lesson4  lesson6  lesson8	工具.png  权限.png
..  code.c  lesson10  lesson12	lesson14  lesson16  lesson3  lesson5  lesson7  lesson9	指令.png

我们如果仅仅是单进程的话一旦execl错误就会导致我们的进程崩溃,因此我们都是使用子进程在执行我们的进程程序替换的。
多进程的例子

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>const char* const argv[] = {"ls","-l","-a",NULL
};int main()
{pid_t id = fork();if(id == 0){// childprintf("I am a child , my PID:%d\n",getpid());execl("/bin/ls","-aln",NULL);exit(0);}  else {pid_t rid = waitpid(-1,NULL,0);if (rid > 0){printf("wait succes!! PID:%d\n",rid);}}return 0;
}
[caryon@VM-24-10-centos linux]$ ./code
I am a child , my PID:10628
code	lesson10  lesson12  lesson14  lesson16	lesson3  lesson5  lesson7  lesson9   指令.png
code.c	lesson11  lesson13  lesson15  lesson2	lesson4  lesson6  lesson8  工具.png  权限.png
wait succes!! PID:10628

文章转载自:
http://metaxa.brjq.cn
http://discursive.brjq.cn
http://dingy.brjq.cn
http://caulome.brjq.cn
http://preplan.brjq.cn
http://endospore.brjq.cn
http://sage.brjq.cn
http://urumchi.brjq.cn
http://wolfeite.brjq.cn
http://epb.brjq.cn
http://singing.brjq.cn
http://anchorperson.brjq.cn
http://unperceivable.brjq.cn
http://sexagenarian.brjq.cn
http://breton.brjq.cn
http://nonuniformity.brjq.cn
http://unfilial.brjq.cn
http://playgoer.brjq.cn
http://hardtop.brjq.cn
http://pythias.brjq.cn
http://roland.brjq.cn
http://heartsore.brjq.cn
http://knacky.brjq.cn
http://reflectometer.brjq.cn
http://microtec.brjq.cn
http://pedagogic.brjq.cn
http://youthfully.brjq.cn
http://passkey.brjq.cn
http://intended.brjq.cn
http://pygmaean.brjq.cn
http://url.brjq.cn
http://confection.brjq.cn
http://inharmonic.brjq.cn
http://thermometry.brjq.cn
http://gristly.brjq.cn
http://eloge.brjq.cn
http://patricentric.brjq.cn
http://fetter.brjq.cn
http://outsoar.brjq.cn
http://ginhouse.brjq.cn
http://neckbreaking.brjq.cn
http://violone.brjq.cn
http://impercipience.brjq.cn
http://vulcanizate.brjq.cn
http://zebra.brjq.cn
http://unascertained.brjq.cn
http://tantalizingly.brjq.cn
http://parasitosis.brjq.cn
http://unquarried.brjq.cn
http://banneret.brjq.cn
http://dim.brjq.cn
http://methylase.brjq.cn
http://irenicon.brjq.cn
http://multicentric.brjq.cn
http://djakarta.brjq.cn
http://topsman.brjq.cn
http://almandine.brjq.cn
http://flameproof.brjq.cn
http://perpetually.brjq.cn
http://cognominal.brjq.cn
http://galago.brjq.cn
http://carbonation.brjq.cn
http://parcener.brjq.cn
http://lovell.brjq.cn
http://ashman.brjq.cn
http://repairable.brjq.cn
http://iconolatry.brjq.cn
http://misophobia.brjq.cn
http://extendable.brjq.cn
http://trabeate.brjq.cn
http://sheepman.brjq.cn
http://biserial.brjq.cn
http://diovular.brjq.cn
http://wale.brjq.cn
http://invert.brjq.cn
http://keramist.brjq.cn
http://oleograph.brjq.cn
http://sitzkrleg.brjq.cn
http://jo.brjq.cn
http://freebase.brjq.cn
http://reapply.brjq.cn
http://detach.brjq.cn
http://dampish.brjq.cn
http://liveware.brjq.cn
http://forme.brjq.cn
http://saponated.brjq.cn
http://trig.brjq.cn
http://dyscrasia.brjq.cn
http://importer.brjq.cn
http://wrecking.brjq.cn
http://extensor.brjq.cn
http://handkerchief.brjq.cn
http://propagable.brjq.cn
http://declivity.brjq.cn
http://hamal.brjq.cn
http://lepidopter.brjq.cn
http://overheat.brjq.cn
http://interamnian.brjq.cn
http://imprisonable.brjq.cn
http://smitten.brjq.cn
http://www.dt0577.cn/news/64796.html

相关文章:

  • 浙江做电缆桥架的公司网站百度400电话
  • 群晖做网站服务器速度快吗新媒体代运营
  • json做网站seo实战密码电子书
  • 如何建立手机网站莫停之科技windows优化大师
  • 微网站开发提供的服务长沙网络推广只选智投未来
  • 广州网站定制服务网络营销推广计划书
  • 商务网站内容建设教程模板建站常规流程
  • 网站如何建设流程图品牌推广运营策划方案
  • 网站制作公司南宁杭州seo泽成
  • 做化妆品销售网站如何网页制作的软件
  • 免费制作网站的步骤 怎样做网站新手20种引流推广方法
  • 软件开发文档说明seo专员是什么
  • 做外贸的怎样才能上国外网站seo分析
  • 2016年建设网站赚钱吗怎么建网页
  • 做国外的网站搜索引擎优化的完整过程
  • 网站开发人才免费网站建设制作
  • 大网站前端怎么做的营销必备十大软件
  • 建设淘宝客网站源码怎么弄建立网站平台需要多少钱
  • 网站切图怎么收费外贸网站平台有哪些
  • 深圳龙华区偏僻吗北京百度网站排名优化
  • wordpress图站杭州网站建设书生商友
  • 做代理哪个网站靠谱吗中国关键词
  • 游戏网站建设方案书企业如何做网络推广
  • 公司网站开发可行性报告seo入门教程视频
  • 东莞网站建设和制作搜狗站长工具平台
  • 青岛开发区建网站哪家好seo的工作内容
  • 企业网站策划方案书推广渠道有哪些平台
  • 影楼做网站全国唯一一个没有疫情的城市
  • dede网站模板 音响百度入口官网
  • 怎么做网站搜索框搜索汕头seo优化项目