网站大量收购独家精品文档,联系QQ:2885784924

Linux环境下的并发程序设计.pdf

  1. 1、本文档共34页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux环境下的并发程序设计

黄绍辉  Linux环境下,并发程序的设计有两个选择:多进 程并发、多线程并发。  进程之间的相互通信比较复杂,需要借助管道、 共享内存等进程间通信技术;线程之间由于隶属 于同一个进程,线程共享相同的内存空间,不存 在通信障碍,因为不同的线程可以存取内存中的 同一个变量。  本课件介绍的技术仅限于Posix标准,分两部分:  多进程程序设计  多线程程序设计  在Linux 中,每个进程在创建时都会被分配 一个数据结构,称为进程控制块(Process Control Block ,简称PCB),其中最重要的 成员是进程ID (process ID)。  进程ID 也被称作进程标识符,是一个非负的 整数,在Linux操作系统中唯一地标识一个 进程。  可以通过ps命令查看系统中目前有多少进程 在运行。  该函数原型是:pid_t getpid(void);  在i386架构上 (你的PC机的架构),pid_t 类型和int 类 型完全兼容,所以也可以用int接收函数的返回值。  下面这个程序,每一次运行的输出结果都不同,因为 每次运行时Linux所分配的进程标识符是不同的。 #include sys/types.h /* 提供类型pid_t 的定义*/ #include unistd.h /* 提供函数的定义*/ main() { pid_t pid = getpid(); printf(The current process ID is %d\n, pid); }  当一个进程调用fork ,完成后就出现两个几乎一模 一样的进程,我们也由此得到了一个新进程。  在Linux 中,创造新进程的方法只有一个,就是 fork 。其他一些库函数,如system() ,看起来似乎 它们也能创建新的进程,其实它们实际上也在内 部调用了fork 。包括我们在命令行下运行应用程序, 新的进程也是由shell调用fork制造出来的。  fork有一些很有意思的特征,来看一个小程序: #include sys/types.h sleep(1) 的作用是休眠1s ,确保父 #include stdio.h 进程在子进程之后启动和退出, #include unistd.h 否则父进程可能先于子进程结束, main() { 那时子进程getppid会返回1 pid_t pid; /*此时仅有一个进程*/ pid=fork(); /* 此时已经有两个进程在同时运行*/ if (pid0) printf(fork 出错!); else if (pid==0) printf(我是子进程,这是我的ID :%d ,这是我的父 进程ID :%d\n, getpid(), getppid()); else { sleep(1); printf(我是父进程,这是我的ID :%d , 这是我的子进程ID :%d\n, getpid(), pid); } } • 有趣的地方在于,上面这个程序的输出有两行: 我是子进程,这是我的ID :2339 ,这是我的父进程ID :2338 我是父进程,这是我的ID :2338 ,这是我的子进程ID :2339  在语句pid=fork()之前,只有一个进程在执 行这段代码,但在这条语句之后,就变成两 个进程在执行了,这两个进程的代码部分完 全相同,将要执行的下一条语句都是 if(pid==0)……。其实fork 的意思就是分叉。  两个进程中,原先就存在的那个被称作“父 进程”,新出现的那个被称作“子进程”。 父子进程的区别除了进程标志符(process ID)不同外,变量pid 的值也不相同,pid存 放的是fork 的返回值。  fork调用的一个奇妙之处就是它仅仅被调用一次, 却能够返回两次,它可能有三种不同的返回值:  在父进程中,fork 返回新创建子进程的进程ID ;  在子进程中,fork 返回0 ;  如果出现错误,fork 返回一个负值;  fork 出错可能有两种原因:(1)当前的进程数 已经达到了系统规定

文档评论(0)

yaocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档