c语言 多进程和多线程
C语言中的并发与同步机制

C语言中的并发与同步机制在计算机科学中,并发是指同时执行多个任务的能力。
而同步则是确保多个任务按照一定的顺序执行,以避免资源竞争和不确定的结果。
C语言作为一门广泛应用于系统级编程的语言,提供了一些机制来实现并发和同步操作。
一、进程与线程并发的基础是进程和线程。
进程是指在计算机中运行的一个程序的实例,可以拥有自己的内存空间和资源。
线程是进程内的一个执行流程,与其他线程共享进程的资源。
在C语言中,可以使用标准库提供的<sys/types.h>和<unistd.h>头文件中的相关函数来创建进程。
比如,通过fork()函数可以创建一个新的进程。
父进程在调用fork()函数后,会创建一个子进程,两个进程可以并发地执行不同的任务。
线程的创建需要使用pthread库提供的函数。
通过pthread_create()函数可以创建一个新的线程,并指定线程的入口函数和参数。
多个线程可以并发地执行不同的任务,共享相同的进程资源。
二、互斥量由于多个线程或进程可以同时访问共享资源,所以可能会导致数据竞争的问题。
为了避免这种情况,C语言提供了互斥量(mutex)来实现同步。
使用互斥量可以将对共享资源的访问限制在一个线程或进程中,其他线程或进程需要等待当前线程或进程释放该资源后才能访问。
在C语言中,可以使用pthread库提供的函数来操作互斥量。
比如,通过pthread_mutex_init()函数初始化一个互斥量,并使用pthread_mutex_lock()和pthread_mutex_unlock()函数来加锁和解锁互斥量。
三、条件变量条件变量(condition variable)用于在多个线程之间传递信息,通常与互斥量一起使用来实现线程之间的同步和通信。
C语言中的pthread库提供了条件变量的相关函数。
通过pthread_cond_init()函数初始化一个条件变量,并使用pthread_cond_wait()和pthread_cond_signal()函数来等待和触发条件变量的变化。
多线程和多进程的区别(C++)

多线程和多进程的区别(C++)很想写点关于多进程和多线程的东西,我确实很爱他们。
但是每每想动⼿写点关于他们的东西,却总是求全⼼理作祟,始终动不了⼿。
今天终于下了决⼼,写点东西,以后可以再修修补补也⽆妨。
⼀.为何需要多进程(或者多线程),为何需要并发?这个问题或许本⾝都不是个问题。
但是对于没有接触过多进程编程的朋友来说,他们确实⽆法感受到并发的魅⼒以及必要性。
我想,只要你不是整天都写那种int main()到底的代码的⼈,那么或多或少你会遇到代码响应不够⽤的情况,也应该有尝过并发编程的甜头。
就像⼀个快餐点的服务员,既要在前台接待客户点餐,⼜要接电话送外卖,没有分⾝术肯定会忙得你焦头烂额的。
幸运的是确实有这么⼀种技术,让你可以像孙悟空⼀样分⾝,灵魂出窍,乐哉乐哉地轻松应付⼀切状况,这就是多进程/线程技术。
并发技术,就是可以让你在同⼀时间同时执⾏多条任务的技术。
你的代码将不仅仅是从上到下,从左到右这样规规矩矩的⼀条线执⾏。
你可以⼀条线在main函数⾥跟你的客户交流,另⼀条线,你早就把你外卖送到了其他客户的⼿⾥。
所以,为何需要并发?因为我们需要更强⼤的功能,提供更多的服务,所以并发,必不可少。
⼆.多进程什么是进程。
最直观的就是⼀个个pid,官⽅的说法就:进程是程序在计算机上的⼀次执⾏活动。
说得简单点,下⾯这段代码执⾏的时候[cpp]1. int main()2.3. {4.5. printf(”pid is %d/n”,getpid() );6.7. return 0;8.9. }进⼊main函数,这就是⼀个进程,进程pid会打印出来,然后运⾏到return,该函数就退出,然后由于该函数是该进程的唯⼀的⼀次执⾏,所以return后,该进程也会退出。
看看多进程。
linux下创建⼦进程的调⽤是fork();[cpp]1. #include <unistd.h>2. #include <sys/types.h>3. #include <stdio.h>4.5.6.7. void print_exit()8. {9. printf("the exit pid:%d/n",getpid() );10. }11.12. main ()13. {14. pid_t pid;15. atexit( print_exit ); //注册该进程退出时的回调函数16. pid=fork();17. if (pid < 0)18. printf("error in fork!");19. else if (pid == 0)20. printf("i am the child process, my process id is %d/n",getpid());21. else22. {23. printf("i am the parent process, my process id is %d/n",getpid());24. sleep(2);25. wait();26. }27.28. }i am the child process, my process id is 15806the exit pid:15806i am the parent process, my process id is 15805the exit pid:15805这是gcc测试下的运⾏结果。
c 多线程实现的四种方式

c 多线程实现的四种方式C语言是一种非常流行的编程语言,它可以用来实现多线程编程。
多线程编程可以让你的程序更高效、更快速地运行,因为它可以同时执行多个任务。
在这篇文章中,我们将介绍 C 多线程实现的四种方式。
1. 使用 pthread 库pthread 是一个 POSIX 标准定义的多线程库,它提供了一套API 接口,可以用来实现多线程编程。
使用 pthread,你可以创建多个线程并且控制它们的行为。
这种方式是 C 语言实现多线程的最常用方式之一。
2. 使用 OpenMP 库OpenMP 是一个开源的多线程库,它可以用来在 C 语言中实现多线程编程。
OpenMP 提供了一套 API 接口,可以让你更方便地编写并行程序。
使用 OpenMP,你可以使用 #pragma 指令来控制并行执行的代码块。
3. 使用 POSIX 线程POSIX 线程是一种 POSIX 标准定义的多线程接口,它可以用来实现多线程编程。
与 pthread 类似,POSIX 线程提供了一套 API 接口,可以让你更方便地编写多线程程序。
4. 使用 Windows 线程如果你在 Windows 操作系统上编写 C 语言程序,你可以使用Windows 线程来实现多线程编程。
Windows 线程提供了一套 API 接口,可以让你在 Windows 平台上创建多个线程并且控制它们的行为。
总结以上是 C 多线程实现的四种方式。
在选择使用哪种方式时,你应该考虑自己的需求和使用的操作系统。
不同的方式会有不同的 API 接口、性能和可移植性。
如果你需要了解更多关于 C 多线程编程的知识,可以参考相关的书籍和教程。
C语言并发编程多线程和多进程的应用

C语言并发编程多线程和多进程的应用C语言是一门广泛应用于系统级开发的编程语言,它具备高性能和低级别的特点,常用于操作系统、设备驱动和嵌入式系统的开发。
在实际应用中,多线程和多进程是C语言并发编程的两个重要概念和技术,它们可以提高程序的性能和响应能力。
本文将介绍C语言中多线程和多进程的应用,并探讨它们在不同场景中的优劣和适用性。
一、多线程的应用1. 线程概念及优势多线程是指在一个进程内创建多个并行执行的线程,每个线程可以独立执行不同的任务。
相比单线程程序,多线程程序具有以下优势:- 提高程序的性能:多线程能够将任务拆分为多个子任务,并在多个线程上同时执行,从而减少程序的执行时间。
- 增加程序的响应能力:通过将阻塞操作放在单独的线程中执行,可以避免主线程的阻塞,提高程序的响应速度。
- 使程序结构更清晰:多线程可以提升程序的模块化和可维护性,将不同的功能模块独立封装在不同的线程中,易于理解和扩展。
2. 多线程的创建和同步在C语言中,可以使用标准的线程库如pthread来创建和管理线程。
创建线程的步骤包括线程的初始化、启动和等待线程的结束。
多线程之间的同步可以通过互斥锁、条件变量和信号量等机制来实现。
互斥锁用于保护共享资源的访问,条件变量用于线程之间的通信,信号量则可以用于限制并发访问的数量。
3. 多线程的应用场景多线程适用于以下场景:- 超过单个核心能力的计算任务:通过将任务分解为多个子任务,可以在多个核心上并行执行,提高计算任务的执行效率。
- 服务器应用:通过多线程可以提高服务器的并发处理能力,同时处理多个客户端请求。
- 图形界面程序:通过将耗时操作放在后台线程执行,可以提高界面的流畅性和响应速度。
二、多进程的应用1. 进程概念及优势进程是指一个程序的执行实例,它拥有独立的地址空间和资源。
多进程是指在操作系统中同时运行多个独立的进程,每个进程可以执行不同的任务。
多进程编程的优势包括:- 提高系统的稳定性:通过将不同的任务独立在多个进程中执行,可以避免一个进程的崩溃导致整个系统的崩溃。
linux下的CC++多进程多线程编程实例详解

linux下的CC++多进程多线程编程实例详解linux下的C\C++多进程多线程编程实例详解1、多进程编程#include <stdlib.h>#include <sys/types.h>#include <unistd.h>int main(){pid_t child_pid;/* 创建⼀个⼦进程 */child_pid = fork();if(child_pid == 0){printf("child pid\n");exit(0);}else{printf("father pid\n");sleep(60);}return 0;}2、多线程编程#include <stdio.h>#include <pthread.h>struct char_print_params{char character;int count;};void *char_print(void *parameters){struct char_print_params *p = (struct char_print_params *)parameters;int i;for(i = 0; i < p->count; i++){fputc(p->character,stderr);}return NULL;}int main(){pthread_t thread1_id;pthread_t thread2_id;struct char_print_params thread1_args;struct char_print_params thread2_args;thread1_args.character = 'x';thread1_args.count = 3000;pthread_create(&thread1_id, NULL, &char_print, &thread1_args);thread2_args.character = 'o';thread2_args.count = 2000;pthread_create(&thread2_id, NULL, &char_print, &thread2_args);pthread_join(thread1_id, NULL);pthread_join(thread2_id, NULL);return 0;}3、线程同步与互斥1)、互斥pthread_mutex_t mutex;pthread_mutex_init(&mutex, NULL);/*也可以⽤下⾯的⽅式初始化*/pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&mutex);/* 互斥 */thread_flag = value;pthread_mutex_unlock(&mutex);2)、条件变量int thread_flag = 0;pthread_mutex_t mutex;pthread_cond_t thread_flag_cv;\void init_flag(){pthread_mutex_init(&mutex, NULL);pthread_cond_init(&thread_flag_cv, NULL);thread_flag = 0;}void *thread_function(void *thread_flag){while(1){pthread_mutex_lock(&mutex);while(thread_flag != 0 ){pthread_cond_wait(&thread_flag_cv, &mutex);}pthread_mutex_unlock(&mutex);do_work();}return NULL;}void set_thread_flag(int flag_value){pthread_mutex_lock(&mutex);thread_flag = flag_value;pthread_cond_signal(&thread_flag_cv);pthread_mutex_unlock(&mutex);}感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!。
C语言技术的实际应用场景及应用案例解析

C语言技术的实际应用场景及应用案例解析在当今信息技术高速发展的时代中,C语言作为一种广泛应用的编程语言,被广泛用于软件开发和嵌入式系统等领域。
本文将探讨C语言技术的实际应用场景,并通过解析一些应用案例来更加深入地理解C语言在各个领域的重要性和优势。
第一节:软件开发领域中的C语言应用在软件开发领域,C语言凭借其高效的性能和可移植性成为首选的编程语言之一。
下面我们将讨论一些C语言在软件开发中的应用场景和案例。
1. 操作系统开发C语言广泛应用于操作系统的开发中。
例如,Unix、Linux等操作系统的内核和设备驱动程序都是用C语言编写的。
C语言的底层访问能力和强大的指针操作使得它在开发高性能和高效率的操作系统方面占有重要地位。
2. 编译器和解释器开发C语言本身就是一种编译型语言,因此使用C语言开发编译器和解释器具有很高的可行性。
例如,GCC编译器就是用C语言编写的,它能够将C语言代码转换成可执行文件。
3. 数据库系统开发许多数据库系统,如MySQL、PostgreSQL等,都是使用C语言进行开发的。
C语言的高效和对底层资源的直接访问能力,使其成为实现高性能数据库系统的理想选择。
第二节:嵌入式系统中的C语言应用在嵌入式系统领域,C语言凭借其简洁的语法和可移植性,成为最流行的编程语言之一。
下面我们将探讨一些C语言在嵌入式系统中的应用场景和案例。
1. 微控制器开发很多微控制器和单片机的开发都使用C语言。
C语言的特性使得程序员可以方便地控制硬件资源,实现各种嵌入式系统的功能。
例如,Arduino开发板上的程序就是用C语言编写的。
2. 嵌入式系统驱动程序开发C语言被广泛应用于嵌入式系统的驱动程序开发中。
驱动程序负责控制硬件设备的底层操作,与硬件进行交互。
C语言通过指针操作和底层访问能力,使得编写驱动程序变得更加灵活和高效。
3. 嵌入式系统中的实时任务许多嵌入式系统需要同时处理多个实时任务。
C语言提供了多线程和多进程的支持,可以很方便地实现实时任务的调度和并发执行。
c语言多线程编程实例

c语言多线程编程实例C语言多线程编程实例多线程编程是一种并发编程的方式,它可以让程序同时执行多个任务,提高程序的效率和响应速度。
C语言是一种广泛使用的编程语言,也支持多线程编程。
本文将介绍一些C语言多线程编程的实例,帮助读者更好地理解和掌握多线程编程技术。
1. 创建线程在C语言中,可以使用pthread库来创建线程。
下面是一个简单的例子,创建一个线程并让它输出一段文字:```#include <stdio.h>#include <pthread.h>void* thread_func(void* arg){printf("Hello, world!\n");return NULL;}int main(){pthread_t tid;pthread_create(&tid, NULL, thread_func, NULL);pthread_join(tid, NULL);return 0;}```在上面的代码中,我们定义了一个函数thread_func,它将作为线程的入口函数。
在main函数中,我们使用pthread_create函数创建了一个线程,并将thread_func作为入口函数。
然后使用pthread_join 函数等待线程结束。
2. 线程同步在多线程编程中,线程之间的同步非常重要。
下面是一个例子,演示如何使用互斥锁来保护共享资源:```#include <stdio.h>#include <pthread.h>int count = 0;pthread_mutex_t mutex;void* thread_func(void* arg){pthread_mutex_lock(&mutex);count++;printf("Thread %d: count = %d\n", (int)arg, count); pthread_mutex_unlock(&mutex);return NULL;}int main(){pthread_t tid1, tid2;pthread_mutex_init(&mutex, NULL);pthread_create(&tid1, NULL, thread_func, (void*)1); pthread_create(&tid2, NULL, thread_func, (void*)2); pthread_join(tid1, NULL);pthread_join(tid2, NULL);pthread_mutex_destroy(&mutex);return 0;}```在上面的代码中,我们定义了一个全局变量count,它将被两个线程同时访问。
C语言多线程操作

C语⾔多线程操作多线程是多任务处理的⼀种特殊形式,多任务处理允许让电脑同时运⾏两个或两个以上的程序。
⼀般情况下,两种类型的多任务处理:基于进程和基于线程。
基于进程的多任务处理是程序的并发执⾏。
基于线程的多任务处理是同⼀程序的⽚段的并发执⾏。
多线程程序包含可以同时运⾏的两个或多个部分。
这样的程序中的每个部分称为⼀个线程,每个线程定义了⼀个单独的执⾏路径。
本教程假设您使⽤的是 Linux 操作系统,我们要使⽤ POSIX 编写多线程 C++ 程序。
POSIX Threads 或 Pthreads 提供的 API 可在多种类 Unix POSIX 系统上可⽤,⽐如 FreeBSD、NetBSD、GNU/Linux、Mac OS X 和 Solaris。
下⾯的程序,我们可以⽤它来创建⼀个POSIX 线程:#include <pthread.h>pthread_create (thread, attr, start_routine, arg)在这⾥,pthread_create 创建⼀个新的线程,并让它可执⾏。
下⾯是关于参数的说明:参数描述thread指向线程标识符指针。
attr⼀个不透明的属性对象,可以被⽤来设置线程属性。
您可以指定线程属性对象,也可以使⽤默认值 NULL。
start_routine线程运⾏函数起始地址,⼀旦线程被创建就会执⾏。
arg运⾏函数的参数。
它必须通过把引⽤作为指针强制转换为 void 类型进⾏传递。
如果没有传递参数,则使⽤ NULL。
创建线程成功时,函数返回 0,若返回值不为 0 则说明创建线程失败。
使⽤下⾯的程序,我们可以⽤它来终⽌⼀个 POSIX 线程:#include <pthread.h>pthread_exit (status)在这⾥,pthread_exit ⽤于显式地退出⼀个线程。
通常情况下,pthread_exit() 函数是在线程完成⼯作后⽆需继续存在时被调⽤。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
进程是一个具有独立功能的程序关于某个数据集合的一次可以并发执行的运行活动,是处于活动状态的计算机程序。进程作为构成系统的基本细胞,不仅是系统内部独立运行的实体,而且是独立竞争资源的基本实体。
进程是资源管理的最小单位,线程是程序执行的最小单位。进程管理着资源(比如cpu、内存、文件等等),而将线程分配到某个cpu上执行。在操作系统设计上,从进程演化出线程,最主要的目的就是更好的支持多处理器系统和减小上下文切换开销。
进程的状态系统为了充分的利用资源,对进程区分了不同的状态.将进程分为新建,运行,阻塞,就绪和完成五个状态.
新建表示进程正在被创建,
运行是进程正在运行,
阻塞是进程正在等待某一个事件发生,
就绪是表示系统正在等待CPU来执行命令,
完成表示进程已经结束了系统正在回收资源.
由于UNIX系统是分时多用户系统, CPU按时间片分配给各个用户使用,而在实质上应该说CPU按时间片分配给各个进程使用,每个进程都有自己的运行环境以使得在CPU做进程切换时不会"忘记"该进程已计算了一半的"半成品”.以DOS的概念来说,进程的切换都 是一次"DOS中断"处理过程, 包括三个层次:
char *string;
说明:
本调用将参数string传递给一个命令解释器(一般为sh)执行,即string被解释为一条命令,由sh执行该命令.若参数string为一个空指针则为检查命令解释器是否存在.
该命令可以同命令行命令相同形式,但由于命令做为一个参数放在系统调用中,应注意编译时对特殊意义字符的处理.命令的查找是按PATH环境变量的定义的.命令所生成的后果一般不会对父进程造成影响.
}
pclose(fd);
2.
功能:等待一个子进程返回并修改状态
语法:
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(stat_loc)
int *stat_loc;
说明:允许调用进程取得子进程的状态信息.调用进程将会挂起直到其
一个子进程终止.
sprintf(command,"ps t tty%02i",i);
system(command);
}
2.
功能:执行一个文件
语法
#include <unistd.h>
int execve(const char* path, char* const* argv,char* const* envp);
int execl(const char* path, char* arg,...);
返回值:当参数为空指针时,只有当命令解释器有效时返回值为非零.若参数不为空指针,返回值为该命令的返回状态(同waitpid())的返回值.命令无效或语法错误则返回非零值,所执行的命令被终止.其他情况则返回-1.
例子:char command[81];
int i;
for (i=1;i<8;i++) {
1)用户数据的保存:包括正文段(TEXT),数据段(DATA,BSS),栈段(STACK),共享内存段(SHARED MEMORY)的保存.
2)寄存器数据的保存:包括PC(program counter,指向下一条要执行的指令的地址), PSW(processor status word,处理机状态字), SP(stack pointer,栈指针), PCBP(pointer of process control block,进程控制块指针), FP(frame pointer,指向栈中一个函数的local变量的首地址), AP(augument pointer,指向栈中函数调用的实参位置), ISP(interrupt stack pointer,中断栈指针),以及其他的通用寄存器等.
语法:
#include <sys/types.h>
#include <sys/wait.h>
fork()和exec()这两个函数,前者用于并行执行,父、子进程执行相同正文中的不同部分;后者用于调用其他进程,父、子进程执行不同的正文,调用前,一般应为子进程创造一个干净的环境。
fork()以后,父、子进程共享代码段,并只重新创建数据有改变的页(段页式管理)
exec()以后,建立新的代码段,用被调用程序的内容填充。
1.
一件复杂的事件是可以分解成若干个简单事件来解决的,这在程序员的大脑中早就形成了这种概念,首先将问题分解成一个个小问题,将小问题再细分,最后在一个合适的规模上做成一个函数.在软件工程中也是这么说的.如果我们以图的方式来思考,一些小问题的计算是可以互不干扰的,可以同时处理,而在关键点则需要统一在一个地方来处理,这样程序的运行就是并行的,至少从人的时间观念上来说是这样的.而每个小问题的计算又是较简单的.
返回值:等待到一个子进程返回时,返回值为该子进程号,否则返回值为
-1.同时stat_loc返回子进程的返回值.
例子:/*父进程*/
if (fork()>0) {
wait((int *)0);
/*父进程等待子进程的返回*/
}
else {
/*子进程处理过程*/
exit(0);
}
2.
功能:等待指定进程号的子进程的返回并修改状态
第三步,复制一个父进程的进程表项的副本给子进程。内核初始化子进程的进程表项时,是从父进程处拷贝的。所以子进程拥有与父进程一样的uid、当前目录、当前根、用户文件描述符表等。
第四步,把与父进程相连的文件表和索引节点表的引用数加1。这些文件自动地与该子进程相连。
第五步,内核为子进程创建用户级上下文。内核为子进程的代码段分配内存,并复制父进程的区内容,生成的是进程的静态部分。
FILE * fd;
if ((fd=popen("ps -ef","r"))==NULL) {
d\n");
return;
}
else {
char str[80];
while (fgets(str,80,fd)!=NULL)
printf("%s\n",str);
3修改两者的堆栈,给父进程返回子进程号,给子进程返回0(父进程知道每个子进程的标志号,而子进程可根据需要调用getppid()来获得父进程的标志号)。
例子:
pid_t fork(void)
#include <unistd.h>
pid_t pid;
if((pid=fork())==0)
{
//子进程代码
与一般情况不同,exec函数族的函数执行成功后不会返回,因为调用进程的实体,包括代码段,数据段和堆栈等都已经被新的内容取代,只留下进程ID等一些表面上的信息仍保持原样,颇有些神似"三十六计"中的"金蝉脱壳"。看上去还是旧的躯壳,却已经注入了新的灵魂。只有调用失败了,它们才会返回一个-1,从原程序的调用点接着往下执行。
第六步,生成进程的动态部分,然后对父进程返回子进程的pid,对子进程返回0。
从父进程拷贝的内容主要有:
●用户标识符,包括实际用户号(real)和有效用户号(effective);
●环境变量
●打开的文件描述符、套接字描述符
●信号处理设置
●堆栈
●目录
●进程组标志(process ID)
●会晤组标志(session ID)
●正文
子进程特有内容:
●进程号
●父进程号
●进程执行时间
●未处理的信号被处理为空
●不继承异步的输入输出操作
简述:fork()调用成功时,分别返回两个整数,对父进程返回 〉0的整数,对子进程返回 0,
函数执行过程:
1内核在系统进程表中,创建一个新条目;
2复制父进程内容(已打开的文件描述符、堆栈、正文等);
int execp(const char* file, char* arg,...);
int execle(const char* path, const char* argv,...,char* const* envp);
int execv(const char* path, char* const* arg);
语法:
#include <stdio.h>
FILE *popen(command,type)
char *command,type;
说明:本系统调用在调用进程和被执行命令间创建一个管道.
参数command做为被执行的命令行.type做为I/O模式,"r"为从被
执行命令读,"w"为向被执行命令写.返回一个标准流指针,做为管
exit(0);
}
else if(pid>0)
{
//父进程代码
exit(0);
}
else
{
printf("Error");
exit(1);
}
2.
功能:产生一个新的进程,子进程执行指定的命令.
语法:
#include <stdio.h>
#include <stdlib.h>
int system(string)
1.2
这样的程序对程序员来说不亚于管理一班人,程序员为每个进程设计好相应的功能,并通过一定的通讯机制将它们有机地结合在一起,对每个进程的设计是简单的,只在总控部分小心应付(其实也是蛮简单的),就可完成整个程序的施工.
1.
这个特点是操作系统的特点,各个进程是独立的,不会串位.
1.
比如在一个数据电话查询系统中,将程序设计成一个进程只处理一次查询即可,即完成一个事务.当电话查询开始时,产生这样一个进程对付这次查询;另一个电话进来时,主控程序又产生一个这样的进程对付,每个进程完成查询任务后消失.这样的编程多简单,只要做一次查询的程序就可以了.