关于学习进程控制和线程控制的小结

来源:互联网 发布:酒店行业数据 编辑:程序博客网 时间:2024/05/22 11:32

小编是刚入门不久的小菜鸟,写此文章希望能够帮助那些也是刚刚开始学习的新手带来一些帮助,愿大神们多多指点。

 

进程控制原理

           什么叫进程?简单地来说,进程就是程序的一次执行。(接下来关于进程的临界区呀、临界资源呀、死锁、进程调度等概念,小编就不在这里一一介绍啦,希望各位朋友通过相关途径把概念弄明白。下面小编就总结一下进程的相关编程)

进程ID(PID):标识进程的唯一数字。             父进程的ID(PPID)           启动进程的用户ID(UID)

 

---------------------------------------------------------------------------------------------------------------------------------------------------------

进程创建-fork()函数:

       头文件:include<unistd.h>

                     pid_t fork(void)  

       功能:创建子进程

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

                      1.在父进程中,fork返回新创建的子进程的PID;

                      2.在子进程中,fork返回0;

                      3.如果出现错误,fork返回一个负值

这些大家要记住哦!理解了,在编程上就感觉不那么吃力啦!

---------------------------------------------------------------------------------------------------------------------------------------------------------

                                                                    fork    PK      vfork

我们来看看这两个函数的区别吧:

1.fork:子进程拷贝父进程的数据段

   vfork:子进程和父进程共享数据段

 

2.fork:父、子进程的执行次序不确定

   vfork:子进程先运行、父进程后运行

---------------------------------------------------------------------------------------------------------------------------------------------------------

                                                                     exec函数族

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

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

头文件:include<unistd.h>

              int execl(const char *path,const char *arg1,....)

参数说明:

              path:被执行程序名(含完整路径)

              arg1-argn:被执行程序所需的命令行参数,含程序名。以空指针(NULL)结束。

在这里还有execlp、execp、execv、system等函数族,小编就不一一介绍了,都是大同小异的,理解一个,其他的就好办多了,读者可以到网上百度百科查看一下哦!

---------------------------------------------------------------------------------------------------------------------------------------------------------

进程的等待-wait()函数:

      头文件:include<sys/types.h>

                  include<sys/waith.h>

                    pid_t wait(int *status)

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

---------------------------------------------------------------------------------------------------------------------------------------------------------

                                                                 

                                                                      多线程

---------------------------------------------------------------------------------------------------------------------------------------------------------

        Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a

 

创建线程(属于就绪态)

#include<pthread.h>

     int pthread_create(pthread_t *tidp,const pthread_attr_t *arr,void*(*start_rth)(void),void *arg)

tidp:线程id

attr:线程属性(通常为空)

strat_rth:线程要执行的函数

arg:start_rtn的参数

---------------------------------------------------------------------------------------------------------------------------------------------------------

编译

      因为pthread的库不是linux系统的库,所以在进行编译的时候要加上 -lpthread

# gcc filename -lpthread

---------------------------------------------------------------------------------------------------------------------------------------------------------

终止进程

       如果进程中任何一个线程中调用exit或_exit,那么整个进程都会终止。线程的正常退出方式有:

1.线程从有启动例程中返回(return)

2.线程可以被另一个进程终止

3.线程自己调用pthread_exit函数

---------------------------------------------------------------------------------------------------------------------------------------------------------

进程退出

#include<pthread.h>

     void pthread_exit(void *rval_ptr)

功能:终止调用进程

rval_ptr:线程退出返回的指针

---------------------------------------------------------------------------------------------------------------------------------------------------------

线程等待

#include<phread.h>

     int pthread_join(pthread_t tid,void **rval_ptr)

功能:阻塞调用线程,直到指定的线程终止

tid:等待退出的线程id

rval_ptr:线程退出的返回值的指针

---------------------------------------------------------------------------------------------------------------------------------------------------------                                                                            清除       

         线程终止有两种情况的(正常终止和非正常终止),在这里我和大家分享一下我对这两种情况的见解:

线程主动调用pthread_exit或者从线程函数中return都将使线程正常退出,这是可预见的退出方式;非正常终止线程在其他线程的干预下,或者由于自身运行出错(比如访问非法地址)而退出,这种退出方式是不可预见的哦!

        不论是可预见的线程终止还是异常终止,都会存在资源释放的问题,如何保证线程终止时能顺利的释放掉自己所占用的资源,是一个必须解决的问题。(希望大家对这个也能好好理解微笑

        从pthread_cleanup_push()的调用点到pthread_clranup_pop之间的程序段中的终止动作(包括调用pthread_exit()和异常终止,不包括return)都将执行pthread_clanup_push()所指定的清理函数。

       #include<pthread.h>

        void pthread_cleanup_push(void (*rtn)(void *),void *arg)

功能:将清楚函数压入清楚栈

            rth:清楚函数

            arg:清楚函数的参数

 

#include<pthread.h>

oid pthread_clanup_pop(int executc)

功能:将清楚函数弹出清楚栈

            executc:执行到pthread_cleanup_pop()时是否弹出清理函数的同时执行该函数,非0:执行;0:不执行 

--------------------------------------------------------------------------------------------------------------------------------------------------------      在这里简单地总结了下进程和线程,希望能给像我这样的新手带来帮助,谢谢大家观赏微笑

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 0