多进程编程
1.Process
创建进程的类:Process([group[,target[,name[,args[,kwargs]]]]]),target表示调用对象,args表示调用对象的位置参数元组。kwargs表示调用对象的字典。name为别名。group实质上不使用。
方法:is_alive()、join([timeout])、run()、start()、terminate()。其中,Process以start()启动某个进程。
属性:authkey、daemon(要通过start()设置)、exitcode(进程在运行时为None、如果为–N,表示被信号N结束)、name、pid。其中daemon是父进程终止后自动终止,且自己不能产生新进程,必须在start()之前设置。
例1.1:创建函数并将其作为单个进程
importmultiprocessing
importtime
defworker(interval):
n=5
whilen>0:
print("Thetimeis{0}".format(time.ctime()))
time.sleep(interval)
n-=1
if__name__=="__main__":
p=multiprocessing.Process(target=worker,args=(3,))
p.start()
print"p.pid:",p.pid
print"p.name:",p.name
print"p.is_alive:",p.is_alive()
结果
12345678p.pid:8736p.name:Process-1p.is_alive:TrueThetimeisTueApr2120:55:122015ThetimeisTueApr2120:55:152015ThetimeisTueApr2120:55:182015ThetimeisTueApr2120:55:212015ThetimeisTueApr2120:55:242015
例1.2:创建函数并将其作为多个进程
importmultiprocessing
importtime
defworker_1(interval):
print"worker_1"
time.sleep(interval)
print"endworker_1"
defworker_2(interval):
print"worker_2"
time.sleep(interval)
print"endworker_2"
defworker_3(interval):
print"worker_3"
time.sleep(interval)
print"endworker_3"
if__name__=="__main__":
p1=multiprocessing.Process(target=worker_1,args=(2,))
p2=multiprocessing.Process(target=worker_2,args=(3,))
p3=multiprocessing.Process(target=worker_3,args=(4,))
p1.start()
p2.start()
p3.start()
print("ThenumberofCPUis:"+str(multiprocessing.cpu_count()))
forpinmultiprocessing.active_children():
print("childp.name:"+p.name+" p.id"+str(p.pid))
print"END!!!!!!!!!!!!!!!!!"
结果
1234567891011ThenumberofCPUis:4childp.name:Process-3p.id7992childp.name:Process-2p.id4204childp.name:Process-1p.id6380END!!!!!!!!!!!!!!!!!worker_1worker_3worker_2endworker_1endworker_2endworker_3
例1.3:将进程定义为类
importmultiprocessing
importtime
classClockProcess(multiprocessing.Process):
def__init__(self,interval):
multiprocessing.Process.__init__(self)
self.interval=interval
defrun(self):
n=5
whilen>0:
print("thetimeis{0}".format(time.ctime()))
time.sleep(self.interval)
n-=1
if__name__=='__main__':
p=ClockProcess(3)
p.start()
注:进程p调用start()时,自动调用run()
结果
12345thetimeisTueApr2120:31:302015thetimeisTueApr2120:31:332015thetimeisTueApr2120:31:362015thetimeisTueApr2120:31:392015thetimeisTueApr2120:31:422015
B. c语言多进程编程
多进程这个词用得比较少,听过来有点不熟悉。你这个程序在linux下应该很容易实行,就是个进程间通信的问题,管道、消息队列、共享内存都可以,可以找找相关资料。昨天失言不好意思。
三个源文件分别为1.c、2.c、3.c一个头文件share.h。
share.h:
//共享的内存,两个数组
typedef struct{
int a[2];
int b[2];
int id;
}share_use;
1.c:
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include"share.h"
int main(){
void *shared_memory = (void *)0;
share_use *share_stuff;
int shmid;
shmid=shmget((key_t)1234,sizeof(share_use),0666|IPC_CREAT);//创建共享内存
if(shmid==-1){
fprintf(stderr,"共享内存创建失败!\n");
exit(1);
}
shared_memory = shmat(shmid, (void *)0,0);//让进程可以访问共享内存
if(shared_memory == (void *)-1){
fprintf(stderr,"启用共享内存失败!\n)";
exit(1);
}
printf("Memory attached at %X\n",(int)shared_memory);
share_stuff = (share_use *)shared_memory;
share_stuff->id=0;
share_stuff->a[0]=1;
share_stuff->a[1]=2;
while(1){
if(share_stuff->id)
exit(0);
sleep(10);
}
}
2.c:
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include"share.h"
int main(){
void *shared_memory = (void *)0;
share_use *share_stuff;
int shmid;
shmid=shmget((key_t)1234,sizeof(share_use),0666|IPC_CREAT);//创建共享内存
if(shmid==-1){
fprintf(stderr,"共享内存创建失败!\n");
exit(1);
}
shared_memory = shmat(shmid, (void *)0,0);//让进程可以访问共享内存
if(shared_memory == (void *)-1){
fprintf(stderr,"启用共享内存失败!\n");
exit(1);
}
printf("Memory attached at %X\n",(int)shared_memory);
share_stuff = (share_use *)shared_memory;
share_stuff->b[0]=share_stuff->a[0]*100;
share_stuff->b[1]=share_stuff->a[1]*100;
while(1)
{
if(share_stuff->id)
exit(0);
sleep(10);
}
}
3.c:
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include"share.h"
int main(){
void *shared_memory = (void *)0;
share_use *share_stuff;
int shmid;
shmid=shmget((key_t)1234,sizeof(share_use),0666|IPC_CREAT);//创建共享内存
if(shmid==-1){
fprintf(stderr,"共享内存创建失败!\n");
exit(1);
}
shared_memory = shmat(shmid, (void *)0,0);//让进程可以访问共享内存
if(shared_memory == (void *)-1){
fprintf(stderr,"启用共享内存失败!\n");
exit(1);
}
printf("Memory attached at %X\n",(int)shared_memory);
share_stuff = (share_use *)shared_memory;
printf("共享内存中有元素:%d , %d",share_stuff->b[0],share_stuff->b[1]);
share_stuff->id=1;
return 0;
}
linux或unix环境下编译
C. 单进程编程与多进程编程最大的区别是什么
单进程编程:顺序执行
多进程编程:同时执行
单进程编程:数据同步
多进程编程:数据异步
单进程编程:复杂度低
多进程编程:复杂度高
单进程编程:用途单一
多进程编程:用途广泛
D. 编了下LINUX多进程编程,遇到了个无法理解的问题,求大神解答
有可能是Makefile有问题的哦。检查下吧。用的头文件都是内核的头文件。
E. 求助:linux多进程编程浅析毕业论文怎么写
linux多进程编程浅析毕业论文的写作格式、流程与写作技巧 广义来说,凡属论述科学技术内容的作品,都称作科学着述,如原始论着(论文)、简报、综合报告、进展报告、文献综述、述评、专着、汇编、教科书和科普读物等。但其中只有原始论着及其简报是原始的、主要的、第一性的、涉及到创造发明等知识产权的。其它的当然也很重要,但都是加工的、发展的、为特定应用目的和对象而撰写的。下面仅就论文的撰写谈一些体会。在讨论论文写作时也不准备谈有关稿件撰写的各种规定及细则。主要谈的是论文写作中容易发生的问题和经验,是论文写作道德和书写内容的规范问题。 论文写作的要求 下面按论文的结构顺序依次叙述。 (一)论文——题目科学论文都有题目,不能“无题”。论文题目一般20字左右。题目大小应与内容符合,尽量不设副题,不用第1报、第2报之类。论文题目都用直叙口气,不用惊叹号或问号,也不能将科学论文题目写成广告语或新闻报道用语。 (二)论文——署名科学论文应该署真名和真实的工作单位。主要体现责任、成果归属并便于后人追踪研究。严格意义上的论文作者是指对选题、论证、查阅文献、方案设计、建立方法、实验操作、整理资料、归纳总结、撰写成文等全过程负责的人,应该是能解答论文的有关问题者。现在往往把参加工作的人全部列上,那就应该以贡献大小依次排列。论文署名应征得本人同意。学术指导人根据实际情况既可以列为论文作者,也可以一般致谢。行政领导人一般不署名。 (三)论文——引言 是论文引人入胜之言,很重要,要写好。一段好的论文引言常能使读者明白你这份工作的发展历程和在这一研究方向中的位置。要写出论文立题依据、基础、背景、研究目的。要复习必要的文献、写明问题的发展。文字要简练。 (四)论文——材料和方法 按规定如实写出实验对象、器材、动物和试剂及其规格,写出实验方法、指标、判断标准等,写出实验设计、分组、统计方法等。这些按杂志 对论文投稿规定办即可。 (五)论文——实验结果 应高度归纳,精心分析,合乎逻辑地铺述。应该去粗取精,去伪存真,但不能因不符合自己的意图而主观取舍,更不能弄虚作假。只有在技术不熟练或仪器不稳定时期所得的数据、在技术故障或操作错误时所得的数据和不符合实验条件时所得的数据才能废弃不用。而且必须在发现问题当时就在原始记录上注明原因,不能在总结处理时因不合常态而任意剔除。废弃这类数据时应将在同样条件下、同一时期的实验数据一并废弃,不能只废弃不合己意者。 实验结果的整理应紧扣主题,删繁就简,有些数据不一定适合于这一篇论文,可留作它用,不要硬行拼凑到一篇论文中。论文行文应尽量采用专业术语。能用表的不要用图,可以不用图表的最好不要用图表,以免多占篇幅,增加排版困难。文、表、图互不重复。实验中的偶然现象和意外变故等特殊情况应作必要的交代,不要随意丢弃。 (六)论文——讨论 是论文中比较重要,也是比较难写的一部分。应统观全局,抓住主要的有争议问题,从感性认识提高到理性认识进行论说。要对实验结果作出分析、推理,而不要重复叙述实验结果。应着重对国内外相关文献中的结果与观点作出讨论,表明自己的观点,尤其不应回避相对立的观点。 论文的讨论中可以提出假设,提出本题的发展设想,但分寸应该恰当,不能写成“科幻”或“畅想”。 (七)论文——结语或结论 论文的结语应写出明确可靠的结果,写出确凿的结论。论文的文字应简洁,可逐条写出。不要用“小结”之类含糊其辞的词。 (八)论文——参考义献 这是论文中很重要、也是存在问题较多的一部分。列出论文参考文献的目的是让读者了解论文研究命题的来龙去脉,便于查找,同时也是尊重前人劳动,对自己的工作有准确的定位。因此这里既有技术问题,也有科学道德问题。 一篇论文中几乎自始至终都有需要引用参考文献之处。如论文引言中应引上对本题最重要、最直接有关的文献;在方法中应引上所采用或借鉴的方法;在结果中有时要引上与文献对比的资料;在讨论中更应引上与 论文有关的各种支持的或有矛盾的结果或观点等。 一切粗心大意,不查文献;故意不引,自鸣创新;贬低别人,抬高自己;避重就轻,故作姿态的做法都是错误的。而这种现象现在在很多论文中还是时有所见的,这应该看成是利研工作者的大忌。其中,不查文献、漏掉重要文献、故意不引别人文献或有意贬损别人工作等错误是比较明显、容易发现的。有些做法则比较隐蔽,如将该引在引言中的,把它引到讨论中。这就将原本是你论文的基础或先导,放到和你论文平起平坐的位置。又如 科研工作总是逐渐深人发展的,你的工作总是在前人工作基石出上发展起来做成的。正确的写法应是,某年某人对本题做出了什么结果,某年某人在这基础上又做出了什么结果,现在我在他们基础上完成了这一研究。这是实事求是的态度,这样表述丝毫无损于你的贡献。有些论文作者却不这样表述,而是说,某年某人做过本题没有做成,某年某人又做过本题仍没有做成,现在我做成了。这就不是实事求是的态度。这样有时可以糊弄一些不明真相的外行人,但只需内行人一戳,纸老虎就破,结果弄巧成拙,丧失信誉。这种现象在现实生活中还是不少见的。 (九)论文——致谢 论文的指导者、技术协助者、提供特殊试剂或器材者、经费资助者和提出过重要建议者都属于致谢对象。论文致谢应该是真诚的、实在的,不要庸俗化。不要泛泛地致谢、不要只谢教授不谢旁人。写论文致谢前应征得被致谢者的同意,不能拉大旗作虎皮。 (十)论文——摘要或提要:以200字左右简要地概括论文全文。常放篇首。论文摘要需精心撰写,有吸引力。要让读者看了论文摘要就像看到了论文的缩影,或者看了论文摘要就想继续看论文的有关部分。此外,还应给出几个关键词,关键词应写出真正关键的学术词汇,不要硬凑一般性用词。 推荐一些比较好的论文网站。 论文之家 http://www.91qikan.com 优秀论文杂志 http://www.interpapers.com/kj/ 论文资料网 http://www.51paper.net/ 法律图书馆 http://www.law-lib.com/ 法学论文资料库 http://www.law-lib.com/lw/ 中国总经理网论文集 http://www.cnceo.com/school/lwj.asp mba职业经理人论坛 http://mba.001.com.cn/mbamba.htm 财经学位论文下载中心 http://www.forumcn.com/sblw/ 公开发表论文_深圳证券交易所 http://www.sse.org.cn/sse/yjkw/gkfblw.asp 中国路桥资讯网论文资料中心 http://www.lqzx.com/lunwen.htm 论文商务中心 http://doc.cei.gov.cn/ 法律帝国: http://www.fl365.com/gb/lawthinker/bbs/default.asp 学术论文 http://www.hrexam.com/advanced1.htm 论文统计 http://www.sci.com.cn/ 北京大学学位论文样本收藏 http://www.lib.pku.e.cn/xwlw.html 学位论文 (清华大学) http://www.lib.tsinghua.e.cn/new/thesis.html 中国科技论文在线 http://www.paper.e.cn/ 论文中国 : http://www.chinawrite.com/ 新浪论文网分类: http://dir.sina.com.cn/search_dir/jy/lw/ 中国论文联盟: http://www.lwlm.com/ 大学生论文库 http://www.syiae.com/lunwen 论文资料网: http://www.51paper.net/
F. 在多进程编程中,用系统调用___来创建新进程,该函数在__中返回值为0,在__中返回值为大于0的进程号,
OpenProcessToken 要对一个任意进程(包括系统安全进程和服务进程)进行指定了写相关的访问权的OpenProcess操作,只要当前进程具有SeDeDebug权限就可以了。要是一个用户是Administrator或是被给予了相应的权限,就可以具有该权限。可是,就算我们用Administrator帐号对一个系统安全进程执行OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcessID)还是会遇到“访问拒绝”的错误。什么原因呢?原来在默认的情况下进程的一些访问权限是没有被启用(Enabled)的,所以我们要做的首先是启用这些权限。与此相关的一些API函数有OpenProcessToken、LookupPrivilegevalue、AdjustTokenPrivileges。 可以看一下这里。。 ke/view/1304692.htm
G. C# .net 多进程编程的例子
Thread t1 = null;
Thread t2 = null;
private void Form1_Load(object sender, EventArgs e)
{
t1 = new Thread(new ThreadStart(T1));
t1.Start();
t2 = new Thread(new ThreadStart(T2));
t2.Start();
}
private void button1_Click(object sender, EventArgs e)
{
if (t1.ThreadState == ThreadState.Aborted||t1.ThreadState==ThreadState.Stopped)
{
MessageBox.Show("线程1结束了");
t1.Abort();
}
if (t2.ThreadState == ThreadState.Aborted||t1.ThreadState==ThreadState.Stopped)
{
MessageBox.Show("线程2结束了");
t2.Abort();
}
}
private void T1()
{
MessageBox.Show("进程1");
}
private void T2()
{
MessageBox.Show("进程2");
}
H. linux多进程编程 看什么书
最近在学习linux环境高级编程,多进程编程算是编程中的最重要的一个部分了,本文让我学习和明白了很多,所以转载过来。让更多想多线程编程的人学习。只有顶到首页才能让更多的人学习。
文章摘要:
多线程程序设计的概念早在六十年代就被提出,但直到八十年代中期,Unix系统中才引入多线程机制,如今,由于自身的许多优点,多线程编程已经得到了广泛的应用。本文我们将介绍在Linux下编写多进程和多线程程序的一些初步知识。
--------------------------------------------------------------------------------
正文:
Linux下的多进程编程初步
1 引言
对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值。fork函数是Unix系统最杰出的成就之一,它是七十年代UNIX早期的开发者经过长期在理论和实践上的艰苦探索后取得的成果,一方面,它使操作系统在进程管理上付出了最小的代价,另一方面,又为程序员提供了一个简洁明了的多进程方法。与DOS和早期的Windows不同,Unix/Linux系统是真正实现多任务操作的系统,可以说,不使用多进程编程,就不能算是真正的Linux环境下编程。
多线程程序设计的概念早在六十年代就被提出,但直到八十年代中期,Unix系统中才引入多线程机制,如今,由于自身的许多优点,多线程编程已经得到了广泛的应用。
下面,我们将介绍在Linux下编写多进程和多线程程序的一些初步知识。
2 多进程编程
什么是一个进程?进程这个概念是针对系统而不是针对用户的,对用户来说,他面对的概念是程序。当用户敲入命令执行一个程序的时候,对系统而言,它将启动一个进程。但和程序不同的是,在这个进程中,系统可能需要再启动一个或多个进程来完成独立的多个任务。多进程编程的主要内容包括进程控制和进程间通信,在了解这些之前,我们先要简单知道进程的结构。
2.1 Linux下进程的结构
Linux下一个进程在内存里有三部分的数据,就是"代码段"、"堆栈段"和"数据段"。其实学过汇编语言的人一定知道,一般的CPU都有上述三种段寄存器,以方便操作系统的运行。这三个部分也是构成一个完整的执行序列的必要的部分。
"代码段",顾名思义,就是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用相同的代码段。"堆栈段"存放的就是子程序的返回地址、子程序的参数以及程序的局部变量。而数据段则存放程序的全局变量,常数以及动态数据分配的数据空间(比如用malloc之类的函数取得的空间)。这其中有许多细节问题,这里限于篇幅就不多介绍了。系统如果同时运行数个相同的程序,它们之间就不能使用同一个堆栈段和数据段。
2.2 Linux下的进程控制
在传统的Unix环境下,有两个基本的操作用于创建和修改进程:函数fork( )用来创建一个新的进程,该进程几乎是当前进程的一个完全拷贝;函数族exec( )用来启动另外的进程以取代当前运行的进程。Linux的进程控制和传统的Unix进程控制基本一致,只在一些细节的地方有些区别,例如在Linux系统中调用vfork和fork完全相同,而在有些版本的Unix系统中,vfork调用有不同的功能。由于这些差别几乎不影响我们大多数的编程,在这里我们不予考虑。
2.2.1 fork( )
fork在英文中是"分叉"的意思。为什么取这个名字呢?因为一个进程在运行中,如果使用了fork,就产生了另一个进程,于是进程就"分叉"了,所以这个名字取得很形象。下面就看看如何具体使用fork,这段程序演示了使用fork的基本框架:
void main(){
int i;
if ( fork() == 0 ) {
/* 子进程程序 */
for ( i = 1; i <1000; i ++ ) printf("This is child process/n");
}
else {
/* 父进程程序*/
for ( i = 1; i <1000; i ++ ) printf("This is process process/n");
}
}
程序运行后,你就能看到屏幕上交替出现子进程与父进程各打印出的一千条信息了。如果程序还在运行中,你用ps命令就能看到系统中有两个它在运行了。
那么调用这个fork函数时发生了什么呢?fork函数启动一个新的进程,前面我们说过,这个进程几乎是当前进程的一个拷贝:子进程和父进程使用相同的代码段;子进程复制父进程的堆栈段和数据段。这样,父进程的所有数据都可以留给子进程,但是,子进程一旦开始运行,虽然它继承了父进程的一切数据,但实际上数据却已经分开,相互之间不再有影响了,也就是说,它们之间不再共享任何数据了。它们再要交互信息时,只有通过进程间通信来实现,这将是我们下面的内容。既然它们如此相象,系统如何来区分它们呢?这是由函数的返回值来决定的。对于父进程,fork函数返回了子程序的进程号,而对于子程序,fork函数则返回零。在操作系统中,我们用ps函数就可以看到不同的进程号,对父进程而言,它的进程号是由比它更低层的系统调用赋予的,而对于子进程而言,它的进程号即是fork函数对父进程的返回值。在程序设计中,父进程和子进程都要调用函数fork()下面的代码,而我们就是利用fork()函数对父子进程的不同返回值用if...else...语句来实现让父子进程完成不同的功能,正如我们上面举的例子一样。我们看到,上面例子执行时两条信息是交互无规则的打印出来的,这是父子进程独立执行的结果,虽然我们的代码似乎和串行的代码没有什么区别。
读者也许会问,如果一个大程序在运行中,它的数据段和堆栈都很大,一次fork就要复制一次,那么fork的系统开销不是很大吗?其实UNIX自有其解决的办法,大家知道,一般CPU都是以"页"为单位来分配内存空间的,每一个页都是实际物理内存的一个映像,象INTEL的CPU,其一页在通常情况下是4086字节大小,而无论是数据段还是堆栈段都是由许多"页"构成的,fork函数复制这两个段,只是"逻辑"上的,并非"物理"上的,也就是说,实际执行fork时,物理空间上两个进程的数据段和堆栈段都还是共享着的,当有一个进程写了某个数据时,这时两个进程之间的数据才有了区别,系统就将有区别的"页"从物理上也分开。系统在空间上的开销就可以达到最小。
下面演示一个足以"搞死"Linux的小程序,其源代码非常简单:
void main()
{
for( ; ; ) fork();
}
这个程序什么也不做,就是死循环地fork,其结果是程序不断产生进程,而这些进程又不断产生新的进程,很快,系统的进程就满了,系统就被这么多不断产生的进程"撑死了"。当然只要系统管理员预先给每个用户设置可运行的最大进程数,这个恶意的程序就完成不了企图了。
2.2.2 exec( )函数族
下面我们来看看一个进程如何来启动另一个程序的执行。在Linux中要使用exec函数族。系统调用execve()对当前进程进行替换,替换者为一个指定的程序,其参数包括文件名(filename)、参数列表(argv)以及环境变量(envp)。exec函数族当然不止一个,但它们大致相同,在Linux中,它们分别是:execl,execlp,execle,execv,execve和execvp,下面我只以execlp为例,其它函数究竟与execlp有何区别,请通过manexec命令来了解它们的具体情况。
一个进程一旦调用exec类函数,它本身就"死亡"了,系统把代码段替换成新的程序的代码,废弃原有的数据段和堆栈段,并为新程序分配新的数据段与堆栈段,唯一留下的,就是进程号,也就是说,对系统而言,还是同一个进程,不过已经是另一个程序了。(不过exec类函数中有的还允许继承环境变量之类的信息。)
那么如果我的程序想启动另一程序的执行但自己仍想继续运行的话,怎么办呢?那就是结合fork与exec的使用。下面一段代码显示如何启动运行其它程序:
char command[256];
void main()
{
int rtn; /*子进程的返回数值*/
while(1) {
/* 从终端读取要执行的命令 */
printf( ">" );
fgets( command, 256, stdin );
command[strlen(command)-1] = 0;
if ( fork() == 0 ) {
/* 子进程执行此命令 */
execlp( command, command );
/* 如果exec函数返回,表明没有正常执行命令,打印错误信息*/
perror( command );
exit( errorno );
}
else {
/* 父进程, 等待子进程结束,并打印子进程的返回值 */
wait ( &rtn );
printf( " child process return %d/n",. rtn );
}
}
}此程序从终端读入命令并执行之,执行完成后,父进程继续等待从终端读入命令。熟悉DOS和WINDOWS系统调用的朋友一定知道DOS/WINDOWS也有exec类函数,其使用方法是类似的,但DOS/WINDOWS还有spawn类函数,因为DOS是单任务的系统,它只能将"父进程"驻留在机器内再执行"子进程",这就是spawn类的函数。WIN32已经是多任务的系统了,但还保留了spawn类函数,WIN32中实现spawn函数的方法同前述UNIX中的方法差不多,开设子进程后父进程等待子进程结束后才继续运行。UNIX在其一开始就是多任务的系统,所以从核心角度上讲不需要spawn类函数。
在这一节里,我们还要讲讲system()和popen()函数。system()函数先调用fork(),然后再调用exec()来执行用户的登录shell,通过它来查找可执行文件的命令并分析参数,最后它么使用wait()函数族之一来等待子进程的结束。函数popen()和函数system()相似,不同的是它调用pipe()函数创建一个管道,通过它来完成程序的标准输入和标准输出。这两个函数是为那些不太勤快的程序员设计的,在效率和安全方面都有相当的缺陷,在可能的情况下,应该尽量避免。
I. 多进程编程 相对于 多线程编程的优势在哪 谁能给解释一下, 谢谢了
1. 多进程的优势在于任务的独立性,比如某个任务单独作为一个进程的话,崩溃只影响自己的服务,其他任务不受影响.如果是多个任务在同一个进程内部利用多个线程进行处理,某个线程发生了未处理的异常的话,会导致整个进程完蛋,所有的任务跟着遭殃.
2. 从资源分配上来说,多进程方案比多线程方案更加灵活和自由.
3. 不过任务间的通信方面多进程要比多线程复杂些,编一个好的多进程通信方案要比多线程间的通信方案困难多了.
-------------------------
以web server为例的话,比如我的服务器上架设了三个网站,如果是用一个进程管理的话, 网站A遭受攻击死掉了,意味着另外两个网站会出现同样的现象. 如果是分开独立的进程的话,三个网站互不影响.