系统级程序设计第二课 进程

本节课主要学习了在ubuntu环境下对于进程的创建相关的一些操作,编译环境:C语言

1.如果子进程执行完了将要被回收,却找不到回收他的父进程(或者说是创建它的父进程不存在了),那么就称这个进程为“孤儿进程”。

2.一个机器的进程号是很有限的,在一个进程结束运行之后是要回收进程号的,而孤儿进程的进程号无法被回收,少的话还并无大碍,可要是孤儿进程太多了的话,就会导致程序在执行时,没有足够的进程号分配,导致程序无法执行,导致电脑瘫痪,而且这种情况储存和内存都不会出现异常,这就是僵尸进程的原理和危害。

3.代码部分 


fork()  //函数父进程创建子进程
fork()包含在函数<unistd.h>中
调用该函数的进程称为父进程
pid_t fork()
// pid相当于int类型

1.调用fork()函数相当于将父进程复制形成一个新的进程,新的进程称为子进程

2.执行了fork(),就相当于有了两个进程,每一个进程都有一个返回值,如果父进程创建子进程成功,则返回子进程的pid,而子进程则返回0,如果创建失败的话就返回-1.

3.父进程编号 1 ,子进程编号 0.(正常情况)。

示例1(创建进程):

(1).代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
    pid_t pid;
    pid=fork(); //创建子进程
    if(pid==-1){
        perror("fork error!");
        exit(-1);
    }
    else if(pid>0){
        printf("parent process, pid = %d,ppid=%d\n",getpid(),getppid());
    }//判断是不是父进程,获得父进程和自己的编号
    else if(pid==0){
        printf("child process,pid =%d,ppid=%d\n",getpid(),getppid());
    }//判断是不是子进程,获得父进程和自己的编号
    else{
        printf("---------finish\n")
    }
    return 0;
}

(2).运行结果

 

 示例2(关于进程的分裂):

(1).与第一段代码相比大概只有如下代码的不同  : 

 for(i=0;i<5;i++){
        if((pid=fork())==0){
            break;
        }
    }
//此段代码,所表示的意思是禁止父进程分裂,只让子进程分裂,并且分裂五次。

(2).全部代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
    pid_t pid;
    int i;
    for(i=0;i<5;i++){
        if((pid=fork())==0){
            break;
        }
    }
    if(pid==-1){
        perror("fork error");
        exit(-1);
    }
    else if(pid>0){
        printf("parent process:pid=%d\n",getpid());
    }
     else if(pid==0){
         printf("children process,pid=%d,pid=%d\n",getpid(),getppid());
    }
    return 0;
}

(3).运行结果如下:

有一个问题(老师在课堂上讲过的):

1.为什么进程的pid排列不按照一定的顺序?

答:因为这些子进程属于同一优先级,所获得的系统资源也一样,先获得的就先输出来;

2.为什么出现了父进程和对应的pid之后会出现bash命令之后,才出现子进程及其pid

答:同样从优先级考虑,因为父进程,子进程还有bash命令优先级相同,共同竞争系统资源,谁优先获取谁就先执行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值