linux学习笔记之进程

来源:互联网 发布:淘宝网羊绒衫 编辑:程序博客网 时间:2024/04/28 18:13

linux中,每个进程在创建时都会分配一个数据结构,称为进程控制块(PCB).用它来记录进程的外部特征,主要包含进程标识符、进程的当前状态、进程相应的程序和数据地址、进程的优先级 etc.

fork和vfork(创建进程)
fork系统调用的作用是复制一个进程,fork创建的进程称为子进程,原来的进程称之为父进程,子进程从父进程得到了数据段和堆栈段的复制,这些需要重新分配内存。fork之后的进程执行顺序是不确定的,取决于内核的调度算法。
fork调用的奇妙在于它仅调用一次却返回两次。父进程中返回子进程的进程ID,子进程中返回0,出现错误则返回负值。

fork出错可能原因:
1.进程数达到系统规定上限
2.系统内存不足(少见,系统没可分配的内存,处于崩溃的边缘.)

vfork的返回与fork相同。但是vfork不需要完全复制父进程的数据段,在子进程没调用exec或exit之前,子进程和父进程共享数据段。fork不对父子进程的执行次序进行限制,但在vfork调用中,子进程先运行,父进程挂起,直到调用exec或exit后执行次序才不会限制。

vfork创建的并不是真正意义上的进程,而是线程,因为它并没有独立的内存资源,子进程和父进程共享数据段。

#include<sys/types.h>#include<unistd.h>#include<stdio.h>#include<stdlib.h>int main(){    int count = 1;    pid_t pid;    printf("before creat son process");    //创建进程之前    if( ( pid = vfork()) < 0){        printf("error in fork!");        exit(1);    }    else if(pid == 0){        int i;        for(i = 0;i < 10;i++){            print("this is son process");        }        exit(1);            //退出子进程    }    else if(pid > 0){        //父进程        printf("this is father,his pid is:%d and the child pid is:%d",getpid(),pid);    }    return 0;}

exec函数族
int execve(const char *pathname,char *const argv[],char *const envp[]);

execve第1个参数path是被执行应用程序的完整路径,第2个参数argv就是传给被执行应用程序的命令行参数,第3个参数envp是传给被执行应用程序的环境变量。

成功则无返回值,出错返回-1。exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。

exit和_exit函数
终止一个进程。exit和_exit的区别在于exit函数调用之前会检查文件的打开情况,把文件缓冲区的内容写回文件;_exit则是直接使进程停止运行,清除内存空间,并销毁其在内核的各种数据结构。

wait和waitpid函数
pid_t wait(int *status);
pid_t waitpid(pid_t pid,int *status,int option);
成功返回进程ID,出错返回-1

进程一旦调用了wait,就立即阻塞自己,由wait自动分析当前进程的某个子进程是否已经退出,如果让他找到这样的一个已经变成僵尸的子进程wait就会收集子进程的信息,把他彻底销毁;如果没有找到就会一直阻塞,知道有一个出现。

僵尸进程:一个进程调用exit之后并没有马上消失,他已经放弃了内存空间,没有可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息

waitpid多出了两个可供用户控制的参数pid和options,可以用来等待指定的进程,可以使进程不挂起立刻返回。

pid>0 只等待进程ID为pid的子进程,只要指定的子进程没结束,waitpid就会一直等待
pid=-1 等待任何的子进程退出 等价于wait
pid=0 等待同一进程组的任何子进程
pid<-1 等待一个指定进程组中的任何子进程,进程组的ID等于pid的绝对值

options一般有两个选项
WNOHANG 即使没有子进程退出,它也会立即返回,不会永远等待下去。如果设置了此选项,waitpid返回0
WUNTRCED常量意思是若实现支持作业控制,而与pid指定的任一子进程已处于暂停状态,并且其状态自暂停以后还没报告过,则返回其状态

#include<sys/types.h>#include<sys/wait.h>#include<unistd.h>#include<stdio.h>#include<stdlib.h>int main(){    pid_t pc,pr;    if( ( pc = fork()) == -1){        printf("failed to create a new process\n");        exit(0);    }    else if(pc == 0){        sleep(10);       //子进程休眠10s        exit(0);    }    do{        pr = waitpid(pc,NULL,WNOHANG); //waitpid不会在这等待        if(pr == 0){           //没有收集到子进程            printf("No child exited\n");            sleep(1);        }    }while(pr == 0);    if(pr == pc){        printf("successfully get child %d\n",pr);    }    else{        printf("some error occured\n");    }    return 0;}
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 鼻咽癌放疗后失去味觉怎么办 感冒会引起肾疼怎么办 iga患者老被传染感冒怎么办 iga肾病感冒了要怎么办 感冒了腰特别疼怎么办 运动后头晕恶心想吐怎么办 3岁儿童自闭症无语言怎么办? 2岁智力发育迟缓怎么办 法国第一年语言没有通过怎么办 听力42天未通过怎么办 7岁儿童叛逆期怎么办 被忽视型幼儿该怎么办 言语发育障碍脑神经损伤怎么办 5岁幼儿胆子小怎么办 幼儿20天胆子小怎么办 两岁宝宝胆子小怎么办 两岁的宝宝胆子小怎么办 孕中期发烧38度怎么办 小班社会交往教案有垃圾怎么办 两个月婴幼儿哭闹入睡难怎么办 8岁儿童睡觉困难怎么办 做精细动作手抖怎么办 15个月宝宝缺锌怎么办 八个月宝宝有蛔虫怎么办 两个月婴儿缺锌怎么办 婴儿天热出汗多尿少怎么办 婴儿5个月不主动抓东西怎么办 打疫苗吃了辣怎么办 四个月宝宝枕秃怎么办 四个月的孩子缺钙怎么办 小孩张牙齿会发烧怎么办 对节白蜡叶子干了怎么办 刷机字库坏了怎么办 魅蓝返回键失灵怎么办 牙蛀严重且牙根松动怎么办 蛀牙伤到神经了怎么办 给客户发错邮件怎么办外贸 cf没有枪声和脚步声怎么办 穿越火线fps太低怎么办 win10玩cf没有声音怎么办 儿子死了欠的钱怎么办