码迷,mamicode.com
首页 > 编程语言 > 详细

线程基本

时间:2018-05-12 22:28:06      阅读:196      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!