Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->Linux程序设计 ->正文

Linux操作系统下的多进程编程详细解析

来源: 作者: 时间:2007-04-11 点击: [收藏] [投稿]

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,它是一个较高层的函数,实际上相当于在SHELL环境下执行一条命令,而exec类函数则是低层的系统调用。
 
  (四) Linux的进程与Win32的进程/线程有何区别
 
  熟悉WIN32编程的人一定知道,WIN32的进程管理方式与UNIX上有着很大区别,在UNIX里,只有进程的概念,但在WIN32里却还有一个“线程”的概念,那么UNIX和WIN32在这里究竟有着什么区别呢?
 
  UNIX里的fork是七十年代UNIX早期的开发者经过长期在理论和实践上的艰苦探索后取得的成果,一方面,它使操作系统在进程管理上付出了最小的代价,另一方面,又为程序员提供了一个简洁明了的多进程方法。
 
  WIN32里的进程/线程是继承自OS/2的。在WIN32里,“进程”是指一个程序,而“线程”是一个“进程”里的一个执行“线索”。从核心上讲,WIN32的多进程与UNIX并无多大的区别,在WIN32里的线程才相当于UNIX的进程,是一个实际正在执行的代码。但是,WIN32里同一个进程里各个线程之间是共享数据段的。这才是与UNIX的进程最大的不同。
 
  下面这段程序显示了WIN32下一个进程怎么样启动一个线程:(请注意,这是个终端方式程序,没有图形界面)

int g;
DWORD WINAPI ChildProcess( LPVOID lpParameter ){
int i;
for ( i = 1; i <1000; i ++) {
g ++;
printf( "This is Child Thread: %d\n", g );
}
ExitThread( 0 );
};
void main()
{
int threadID;
int i;
g = 0;
CreateThread( NULL, 0, ChildProcess, NULL, 0, &threadID );
for ( i = 1; i <1000; i ++) {
g ++;
printf( "This is Parent Thread: %d\n", g );
}
}

  在WIN32下,使用CreateThread函数创建线程,与UNIX不同,线程不是从创建处开始运行的,而是由CreateThread指定一个函数,线程就从那个函数处开始运行。此程序同前面的UNIX程序一样,由两个线程各打印1000条信息。threadID是子线程的线程号,另外,全局变量g是子线程与父线程共享的,这就是与UNIX最大的不同之处。大家可以看出,WIN32的进程/线程要比UNIX复杂,在UNIX里要实现类似WIN32的线程并不难,只要fork以后,让子进程调用ThreadProc函数,并且为全局变量开设共享数据区就行了,但在WIN32下就无法实现类似fork的功能了。所以现在WIN32下的C语言编译器所提供的库函数虽然已经能兼容大多数UNIX的库函数,但却仍无法实现fork。
 
  对于多任务系统,共享数据区是必要的,但也是一个容易引起混乱的问题,在WIN32下,一个程序员很容易忘记线程之间的数据是共享的这一情况,一个线程修改过一个变量后,另一个线程却又修改了它,结果引起程序出问题。但在UNIX下,由于变量本来并不共享,而由程序员来显式地指定要共享的数据,使程序变得更清晰与安全。
 
  Linux还有自己的一个函数叫clone,这个函数是其它UNIX所没有的,而且通常的Linux也并不提供此函数(要使用此函数需自己重新编译内核,并设置CLONE_ACTUALLY_WORKS_OK选项),clone函数提供了更多的创建新进程的功能,包括象完全共享数据段这样的功能。
 
  至于WIN32的“进程”概念,其含义则是“应用程序”,也就是相当于UNIX下的exec了。()


 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<

上一页 1 2下一页


上一篇:Shell编程新手入门 Linux解释器原理   下一篇:Linux操作系统编程经常使用的一些工具

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
·快速编辑Shell命令行
·从2.4到2.6内核发展中的改进
·两个很详细的shell实例
·内核设计篇
·shell技巧
·批量添加用户
·HowtoCreatingandBootingaNewKernelWithautoconf
·利用ip_conntrack表实现封ip的shell脚本,并有简
·30分钟搞定BASH脚本编程!
·Shell初学者的入门知识
推荐文章
·Linux系统套接字编程中存在的五个隐
·shell要如何分类呢?
·Linux操作系统的声音设备编程实例
·DIY乐园 编写Linux系统的设备驱动程
·Linux程式设计-11.ShellScript(bash
·Linux程式设计-11.ShellScript(bash
·Linux操作系统中怎么样安装MySQL数
·创建基本的安全连接和非安全连接
精彩文章
·内核技术:TCP/IP编程实现远程文件传
·Linux下Patch的应用和制作方法介绍
·Linux系统下的Oracle数据库编程详解
·用Shell编程实现DOS风格Linux命令行
·Linux下安装JDK与VI编辑器的基本操
·在Unix下用命令行中完成所有的工作
·Shell编程新手入门 Linux解释器原理
·SCO unix 系统下定时备份oracle数据
·Gartner分析家谈对开源数据库的研究
·跨越边界: Lisp 之美
·Linux程式设计-11.ShellScript(bash
·讲叙Linux系统之Shell编程基础知识
·重燃你的php安全之火
·Linux操作系统下的多进程编程详细解
·使用 Flex 和 Bison 更好地进行错误
·技巧:Vimdiff 使用
·Linux程式设计-11.ShellScript(bash
·Linux编程之序列化存储Python对象(
·Linux 操作系统编程之Shell 问答录
·Linux脚本开发数学库在PHP中的重要
·PHP 配置模式
·我要如何将csh的stdout与stderr导向
·Python anygui 项目预览
·使用 OpenSSL API 进行安全编程(2
·DIY乐园 编写Linux系统的设备驱动程
·Linux操作系统的声音设备编程实例
Power by linux-cn.com 粤ICP备05006655号