linux下多进程编程简介
时间:2009-07-26 来源:embededgood
首先,简单介绍一下我们要用的函数:fork()、wait()。
fork ()函数是一个很有意思的函数。他可以建立一个新进程,把当前的进程分为父进程和子进程。原来进程的所有页面在调用fork()函数时被分为相同的两份, 所以父进程和子进程都使用相同的映像。该函数与普通函数的不同之处是函数如果调用成功会返回两次,在父进程中返回子进程的PID;在子进程中返回0。成功 后,父进程和子进程都在fork()函数后继续执行。如果函数调用不成功,则返回一次,返回值为 -1。
由于在进程运行时,如果子进程先 退出,它不会从进程列表里清除。而要发一个SIGCHLD(或SIGCLD)信号给父进程,父进程确认后子进程才会退出。在等待父进程确认期间,子进程处 于“zombie”状态。所以我们就需要使用wait()函数。如果调用wait()函数时已经有一个处于“zombie”状态的子进程,那么函数立即返 回的同时该子进程从内存中清除出去;否则,主进程会被挂起,直到其中一个进程退出。直接调用wait()函数有个很明显的缺点就是父进程会被挂起而无法进 行其他任务。解决办法就是拦截处理信号SIGCHLD(或SIGCLD),这我会在以后讲信号处理的文章中给大家简单的说说。
老规矩,通过源代码来学习多进程编程。
/*--------------------------fork.c------------------------------*/ |
把wait屏蔽掉,实验如下: 500)this.width=500;" border=0> 加上wait函数,实验现象如下: 500)this.width=500;" border=0> 一般来说,在fork之后是父进程先执行还是子进程先执行是不确定的,这取决于内核所使用的调度算法。 同样,我再给大家补充几点,以供参考。
多进程的好处是同时并行的运行多个任务。由于各自使用独立的内存空间,所以不容易由于冲突而出错。但是这样就给进程间的通信带来了一定的麻烦。当然有很 多办法,比如管道,消息等等可以解决这个问题。多进程还有一个问题就是内存空间的浪费。一个进程就是一个完整的内存映像,有一些数据重复放置,这样对内存 空间浪费是很严重的(我想这也就是多线程比多进程要优越的原因,可惜我还没有完全搞明白linux下的多线程,要不然也和大家讨论讨论。过段时间吧!)。 还有,我要提示的是上面这个例子我在最后用了wait()函数,这样父进程运行完后回等着子进程退出才退出。你可以试试把wait();这个语句去掉,看 看什么效果?父进程运行完退出了,我们回到了[mikespook @ lazycat]$的提示符下,而子进程继续在运行。有时我们可以利用这个把一个进程放到后台去运行(比如木马……当然啦,我不是建议你做木马!)。
好啦,Linux下的多进程编程就怎么点内容,是不是很简单呢?其实,让两个进程独立运行很容易,关键的难点是父进程和子进程共享数据,进行通信。我会在以后的文章中慢慢和大家讨论的(其实关键是有一些东西还没有悟透,不敢拿出来丢人^%^)。
给大家个好站:http://www.opengroup.org/onlinepubs/007908799/ 在线的man手册,有什么不明白的地方可以到这里查询。可惜,是E文的。