4、linux进程控制编程

 

一:

定义

       进程是一个具有一定独立功能的程序的一次运行活动

              特点

       动态性,并发性,独立性,异步性

              状态图

 

进程ID

       进程ID(PID):标识进程的唯一数字 

进程ID(PPID

启动进程的用户ID(UID

       进程互斥

是指有若干进程要使用某一共享资源时,任何时刻最多允许一个进程使用,其他必须等待,直到占用该资源者释放了该资源为止。

       临界资源

操作系统将一次只允许一个进程访问的资源称为临界资源。

       临界区

进程中访问临界资源的那段程序代码称为临界区。

       进程同步

一组并发的进程按一定的顺序执行的过程称为进程间的同步。

       进程调度

概念:按一定的算法,从一组待运行的进程中选出一个来占有CPU运行。

调度方式:抢占式 非抢占式

       调度算法

l         先来先服务

l         短进程优先

l         高优先级优先

l         时间片轮转法

                                图表 1时间片轮转法

 

二:

       获取ID

#include<sys/types.h>

#include<unistd.h>

1)pid_t getpid(void)

获取本进程ID

2)pid_t getppid(void)

获取进程ID

 

例题:getpid.c

#include<stdio.h>

#include<unistd.h>

#include<stdlib.h>

Int main()

{

printf(“PID=%d\n”,getpid());     //获取本程序的ID

printf(“PPID=%d\n”,getppid());    //获取本程序父进程ID

return 0;

}

 

    进程创建—fork

  #include<unistd.h>

pid_t fork(void)

功能:创建子进程

         fork的奇妙之处在于被调用一次,返回两次,它可能有三种不同的返回值

Ø         在父进程中,fork返回新创建的子进程的PID

Ø         在子进程中,fork返回0

Ø         如果出现错误,fork返回-1

Ø        

Ø         fork创建了一个新的子进程,虚线的意思是代表这个进程是共享的(代码段共享),不是新开辟的占用另一块内存,还是使用原来的内存。

 

例题:fork.c

#include <unistd.h>

#include <sys/types.h>

#include <sys/wait.h>

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <math.h>

int main(void)

{

        pid_t child;

        /* 创建子进程 */

        if((child=fork())==-1)

        {

        printf("Fork Error : %s\n", strerror(errno));

        exit(1);

        }

        else

        if(child==0) // 子进程

        {

            printf("I am the child: %d\n", getpid());

            exit(0);

        }

        else        //父进程

        {

            printf("I am the father:%d\n",getpid());

            return 0;

        }

}  

 

        思考题:count运行结果?

        #include<unistd.h>

        #include<stdio.h>

        int main()

        {

        pid_t pid;

        int count=0;

pid=fork();

count++;

printf(“count=%d\n”,count);

return 0;

}

运行结果count=1.

        count=1.        而不是2.

 

子进程的数据空间,堆栈空间都会从父进程那得到一个拷贝,而不是共享。在子进程中对count进行加1的操作,并没有影响到父进程中的count值,父进程中的count值任然为0.

只有代码段是共享的

 

    Fork PK vfork

区别:

l         fork子进程拷贝父进程的数据段

l         vfork 子进程与父进程共享数据段

l         fork 父,子进程的执行次序不确定

l         vfork子进程先运行,父进程后运行

 

exec函数族

        exec用被执行的程序替换调用它的程序。

        区别:

        fork创建一个新的进程,产生一个新的PID

        exex启动一个新的程序,替换原有的进程。因此,此进程的PID不会改变

       

        如图:exec执行时突然启动一个hello程序,则exec会用hello的程序替换掉原来exec中的程序,但是PID不会改变,原来是多少还是多少。

 

            进程等待

        #include<sys/types.h>

        #include<sys/wait.h>

            Pid_t wait (int *status)

        功能:阻塞该进程,直到某个子进程退出。

            #include <unistd.h>

#include <sys/types.h>

#include <sys/wait.h>

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <math.h>

 

int main(void)

{

            pid_t child;

 

            /* 创建子进程 */

                if((child=fork())==-1)

        {

                printf("Fork Error : %s\n", strerror(errno));

                exit(1);

            }

            else

                if(child==0) // 子进程

            {

            printf("the child process is run\n");

            sleep(1);  //子进程睡眠一秒,但并没有去运行父进程

            printf("I am the child: %d\n", getpid());

            exit(0);

            }

            else        //父进程

            {

            wait(NULL); //等到子进程退出,父进程才会运行

            printf("the father process is run\n");

            printf("I am the father:%d\n",getpid());

            return 0;

            }

}  

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值