标签:for print execl linux操作系统 ... 输出 完成 else 代码段
Linux系统中,进程的执行模式划分为用户模式和内核模式,当进程运行于用户空间时属于用户模式,
如果在用户程序运行过程中出现系统调用或者发生中断事件,就要运行操作系统(即核心)程序,进程的运行模式就变为内核模式
在该模式下运行的进程可以执行机器特权指令,而且该进程的运行不受用户的干预
在Linux操作系统中,通过fork()系统调用来创建子进程
目标 |
创建进程 |
头文件 |
#include <unistd.h> |
函数原型 |
pid_t_result=fork(void) |
参数 |
无 |
返回值 |
-1 如果出错 0 返回到子进程 pid 将子进程的进程id返回给父进程 |
将执行fork的操作进程称为父进程,被fork()创建的进程称为该进程的子进程,
当父进程执行fork操作时,操作系统内核执行如下任务完成进程的创建工作:
1.为子进程分配新的内存块和内核数据结构
2.复制原来的进程信息到新的进程,即子进程和父进程具有相同的可执行代码
3.向运行进程集添加新的进程
4.fork执行结束后,将控制返回给2个进程,此时两个进程可独立执行,执行顺序取决于进程调度
#include <stdio.h> main(){ int ret_from_fork,mypid; mypid=getpid(); printf("Before :my pid is %d\n",mypid ); ret_from_fork=fork(); sleep(1); printf("After:my pid is %5d,ret_from_fork:%5d,parent pid :%5d\n",getpid(),ret_from_fork,getppid()); } [root@centos1 process]# ./fork Before :my pid is 22526 After:my pid is 22526,ret_from_fork:22527,parent pid :21968 After:my pid is 22527,ret_from_fork: 0,parent pid :22526
父进程创建子进程后,子进程除了具有相同的代码段拷贝外,也具有相同的数据段,
即父进程的全局变量名称和值子进程也会一起拷贝过去,但他们之间是独立的,可独立改变相互不受影响
#include <sys/types.h> //pid_t 类型的在此 #include <unistd.h> #include <stdio.h> #include <stdlib.h> //exit 用 int glob=6; //全局变量 int main(){ int local; pid_t pid; local = 8; if( (pid=fork()) == 0){ sleep(2); }else if(pid>0){ glob =60; local =80; sleep(10); } printf("glob=%d,local=%d,mypid=%d\n",glob,local,getpid()); exit (0); } [root@centos1 process]# ./var glob=6,local=8,mypid=22800 glob=60,local=80,mypid=22799 第一行输出为子进程,第二行未父进程的输出,说明父子进程由相同的代码,但他们变量之间相互不影响
一般情况下,父进程创建子进程是为了执行特定的任务,通过执行exec家族系列调用让子进程执行新的任务
此时,由exec调用提供的命令的指令代码替换子进程的代码,相当于对子进程进行了换脑
int execl(const char*path,const char* arg0,const char* arg1,.... NULL)
int execlp(const char*path,const char* arg0,const char* arg1,.... NULL)
int execv(const char*path,const char* argv[])
int execvp(const char*path,const char* argv[])
#include <unistd.h> #include <stdio.h> #include <stdlib.h> main(){ char *arglist[3]; pid_t pid; arglist[0]="ls"; arglist[1]="-l"; arglist[2]=0; printf("parent:%d\n",getpid()); pid=fork(); if( pid==0 ){ printf("now pid is:%d\n",getpid() ); execvp("ls",arglist); }else{ printf("parnet pid:%d\n",getpid() ); } printf("in %d\n",getpid()); }
未完待续...
标签:for print execl linux操作系统 ... 输出 完成 else 代码段
原文地址:https://www.cnblogs.com/HKUI/p/9030047.html