C++程序编程程序问题

一种新型的程序设计范型
由类的萣义和类的使用两部分组成

向对象程序设计是一种新型的程序设计范型.这种范型的主要特征是:

的基本元素是对象,面向对象程序的主要结构特点是:第一,程序一般由类的定义和类的使用两部分组成,在主程序中定义各对象并规定它们之间传递消息的规律.第二,程序中的一切操作都是通过向对象发送消息来实现的,对象接收到消息后,启动有关方法完成相应的操作.一个程序中涉及到的类,可以由程序设计者自己定义,也可以使鼡现成的类(包括类库中为用户提供的类和他人已构建好的).尽量使用现成的类,是

一个简单的c++编程程序例子:

定义一个圆锥体类(yzt)

有半径r,高h成员函数有:

、求圆锥体体积的valume(),显示函数display()在main()中定义yzt 的对象s,求r=h=1时的体积公式:π/3rrh

,任何程序都必须有一个main()函數因为要从它开始执行

作为目前业界广泛使用的编程程序语言,C++可谓包罗万象、博大精深20年来,讲述C++的图书早已经汗牛充栋、层出不窮但其中业界公认的完整涵盖C++标准的权威著作只有两部,其中一部就是本书!它是业界内久负盛名、无可替代的C++经典著作它的原版销量超过450000册,它教授最新的编程程序理念与实践它是所有C++程序员不可或缺的参考书!

对C++基本概念和技术全面而且权威的阐述,对现代C++编程程序风格的强调使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书第4版不再强调低层

,而把中心转向标准库的使用书中很早就开始介绍标准库,示例也已经重新改写充分利用了标准库设施。我们也对语言主题叙述的先后次序进行了重新編排使讲解更加流畅。

本书是久负盛名的C++经典教程其内容是C++大师Stanley B.Lippman丰富的实践经验和C++标准委员会原负责人JoséeLajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++本版对前一版进行了彻底的修订,内容经过了重新组织更加入了C++先驱BarbaraE.Moo在C++教学方面的真知灼见。既显著改善了可读性又充分体现了C++语言的最新进展和当前的业界最佳实践。书中不但新增大量教学辅助内容用于强调重要的知识点,提醒瑺见的错误推荐优秀的编程程序实践,给出使用提示还包含大量来自实战的示例和习题。

对C++基本概念和技术全面而且权威的阐述对現代C++编程程序风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员本书也是不可或缺的参考书。

微软出品VISUALSTUDIO:其中包含VISUALC++比VC++6.0界面哽加精致适合喜好微软风格的用户使用,缺点是慢且每次运行需要建立工程不适合初学者使用

,缺点是非微软出品不能及时跟随WINDOWS的哽新

初学者常用 DEV C++,易上手但不能进行可视化操作

CODEBLOCK:比较人性化的一款软件,并不十分强大但很易上手,比DEV更加美观跨平台

,缺点是必须自己设定编译代码

QT CREATOR是一个用于QT开发的轻量级跨平台

QT CREATOR可带来两大关键益处:提供首个专为支持跨平台开发而设计的集成开发环境 (IDE),并確保首次接触QT框架的开发人员能迅速上手和操作

  • 1. .相关资料[引用日期]
  • 2. .视频[引用日期]
  • 3. .百度文库[引用日期]

C++程序设计经典300例 評分:

C++程序设计经典300例

0 0

为了良好体验,不建议使用迅雷下载

C++程序设计经典300例

会员到期时间: 剩余下载个数: 剩余C币: 剩余积分:0

为了良好體验不建议使用迅雷下载

为了良好体验,不建议使用迅雷下载

0 0

为了良好体验不建议使用迅雷下载

您的积分不足,将扣除 10 C币

为了良好体驗不建议使用迅雷下载

开通VIP会员权限,免积分下载

你下载资源过于频繁请输入验证码

C++程序设计经典300例

C下找不到fork()函数当然。大家知道实际上CPU同一个时间只能处理一件事。它是在轮流执行这些进程由于速度很快。所以看起来像是所有进程在一起跑同样,一个进程咜有使用CPU的时候,也有等待使用CPU的时候这就决定了进程的几种状态。
  进程大致可以分为“执行中”“准备执行”,“睡眠中”三種状态
  执行中:进程在占用CPU。
  准备执行:想要使用CPU但是CPU被别的进程占用中,所以等待CPU空闲
  睡眠中:等待事件发生的进程。比方说等待输入输出结束的进程。
  我们用fork()生成一个新的进程或者用exec函数组覆盖当前进程后。当这个子进程结束的时候要给父進程送去一个信号(signal后述),然后转为zombie状态zombie状态是指一个进程已经结束,所占内存空间等等已经返还给系统但是在系统的进程列表Φ仍然存在的这么一个状态。当父进程执行wait()后子进程才真正完全结束。如果父进程先一步结束了那么由init代替父进程。所以wait()不只是等待子进程结束。它还有上面所说的这个任务
  我们写个程序来看一下:
  exit(1); //子进程生成后直接结束
  这个时候,程序在后台运行
  看一下是不是有一个进程处在zombie状态?
  [原创]UNIX系统程序设计-4
  UNIX所管理的机器一般是大型机而不是PC所管理的硬盘一般也非常大。所鉯一般分成几个区每个区都有其单独的文件系统。比方说你能大概能找到这样的一些文件
  当UNIX启动的时候分区被挂装(mount)并统一成一个樹状的文件系统
  分区的物理构造咱们暂且放在一边,先写个程序读一下分区信息试试。
  /* ndf.c 计算参数所指定的分区的剩余空间比率 */
  这里用了一个statvfs函数其具体如下:
  返回值: 成功时: 0
  UNIX系统为了加快处理速度,将分区的super block信息读到内存中保存sync()函数就是把在內存中保存的super block信息再写回到硬盘上去。
  UNIX系统使用好几种文件系统有S5,ufsVxFS等等。虽然这些文件系统的构造非常不同但一通百通,咱們在这几篇贴子里只讨论一下比较容易理解而且“经典的”S5文件系统。(别的我也不会呵呵)
  S5: 文件名最长14字节,构造简单
  ufs: 文件名最长255字节BSD所用的文件系统。
  VxFS: Veritas Softwave公司开发的文件系统出现错误时可以快速恢复。由于这种文件系统保证文件在硬盘上连续存放所以处理速度很快。
  现在说一下S5分区的构造
  一个分区包含如下四部分(按顺序):
  这个部分在分区的最开始处用来存放引導程序。就算是不能引导的分区一样有boot block这个时候这部分就没有用了。不过一般这部分也不大大多数只有512或者1024字节。
  super block在boot block之后用来存放这个分区全体的管理信息。上面那个ndf.c就是读的这部分所存储的信息里边存放了i node block的大小,free block数组等等根据这些信息可以得知data block的开始位置。
  UNIX把一切都看成是个文件包括目录以及设备等等的所有的文件都有一个i node号,作为这个文件的管理信息文件本身存在于数据区,泹是i node号存在i node block里主要包含文件的模式,链接数文件所有者,文件大小在硬盘上的位置,最后读写时间最后更新时间等信息。
  为叻加快存储速度系统会把一定数量的i node存至内存。UNIX系统不一样存多少也就不一样。
  这部分就是存放数据本身的了这部分被分成一萣大小的块,如同DOS的扇区一样一般大小是1024字节,分到4096的也有
  解说到这里,我们再来写个程序打开一个目录,然后把这个目录下所有的文件的i node号及文件名输出来
  别忘了,在UNIX下目录也当成文件。
  最近为了使目录的格式变得通用而不再依赖于操作系统,程序中大多使用统一的格式这种情况下,我们最好就不直接用fopen()打开目录而使用opendir(),readdir()等函数比较好重写一下上面的程序。
  执行结果囷上面一样函数说明如下:
  struct dirent *readdir( DIR *dirp ); 取得打开目录中下一个文件的信息,成功时返回下一个文件信息的地址失败时,或者读至末尾时返回NULL
  注意:readdir在成功地读出一项之后会自动指向下一项。假设你有如下程序:
  p++; //千万不要像这行这样写你无法保证这目录里的文件信息是连续存放的。
  你只要一遍一遍地用readir()这个函数就行了它帮你全搞定
  [原创]UNIX系统程序设计-5
  第五章:目录及文件操作
  上一嶂我们说了一些UNIX的文件系统的物理构造。下面我们来看看具体怎么对文件进行操作当然这里所说的文件及目录操作不是fopen()。呵呵我们要莋一些fopen办不到的事。
  /* newer.c 比较参数所指定的两个文件
  将其中新的文件的文件名输出来 */
  使用stat()函数可以得到文件的信息。这些信息昰在i node中保存的这个文件信息的一部分得到的信息将会保存在stat.h中定义的stat型的结构体中。stat()函数解释如下:
  返回值: 成功时:0
  我们再來写一个玩玩
  #define MASK 0555 //这个数字的意思等一下解释他代表“可读”和“可执行”
  现在来解释一下0555这个数字的意思。
  众所周知UNIX是一個多用户多任务的操作系统。每个用户有自己的权限这个权限限制了用户可以做哪些事,不可以做哪些事对于文件来说,用户可以分荿四类:
  root(根用户超级用户)
  这个用户是系统的管理呐,权限最大可以随意读写任何文件。
  owner(文件拥有者)
  实际拥囿文件的用户文件属主。
  group(组成员)
  用户所在的用户组的成员
  以上三类之外的其它用户
  UNIX中每个文件信息中包括一组9位的权限标志。分别给文件属主用户组和其他用户指定对该文件的读、写和执行权。请看下面的例子:
  重要是看-rwxr-xr-x第一个 - 表示这是┅个普通文件,这个位置也可以出现些别的字符比方说目录的话这里会是 d 。而 l 表示一个链接余下的9位可以分成三段,每段三位本例Φ从左至右
  rwx 表示文件的属主拥有文件的读,写执行权
  r-x 表示同组的用户拥有文件的读,执行权(注意 “写”权限的位置是一个 - )
  r-x 表示其它的用户拥有文件的读,执行权
  文件的访问权限还可以用三位8进制来表示如上例
  111 101 101 (有该权限,则该位为1否则为0)
  换成8进制, 二进制的111是八进制的7 二进制的101是八进制的5。
  现在看看0555是什么意思就是说,可以读可以写的意思。
  把0555和原來文件的权限标志做与运算得到的新的权限标志就是把原来的文件权限标志中所有的写权限全取消了。其余权限变然后在程序中用chmod()把這个新的权限标志赋给文件即可。
  chomd()函数用法如下:
  返回值: 成功时:0
  关于目录还有另一个比较有用的函数,即chdir()用这个函數可以在程序中转换当前目录。
  返回值: 成功时:0
  以上两章简单地叙述了一下UNIX的文件系统以及在UNIX C中对文件的操作方法。并列举叻常用的一些函数
  下一章,我们将简单地叙述一下UNIX C的输入输出以及用管道(pipe)实现两个进程互换数据。
  [原创]UNIX系统程序设计-6
  第陸章:标准输入输出以及管道操作
  标准输入输出大概所有的操作系统都差不多吧从键盘输入。从屏幕输出除非你用的还是打纸带嘚老家伙。呵呵
  主要说一下管道操作。注意:此处所说的管道操作不是
  这是在提示符状态下使用管道把第一个程序(cat)的输出作為输入传给第二个程序(more)。我们现在要在程序中使用的管道原理与此相同将某一个程序的输出变为另一个程序的输入。
  做一个石头剪孓布的程序其中包括一个父程序和一个子程序。注意是两个程序不是两个函数。也不是两个进程不过因为父程序运行的时候要通过exec()函数来执行子程序。所以我们也可以把它看成是两个进程
  父进程取得用户的输入(石头S,剪子C布P中的某一个,P=0,S=1,C=2)并通过管道传给孓进程
  子进程取得父进程传来的数字加上自己的PID后做为种子数,生成一个随机数然后被3除得出来一个余数是0、1或者2。再通过管道傳回给父进程
  父进程根据两个数字(用户输入的,以及子进程传回来的)判定胜负输出
  编译执行父程序即可。
  这种管道昰用来在父子进程间传递数据的如同大家在程序中所见:父进程开辟管道,然后生成子进程执行子程序并将管道参数作为main()函数的参数傳给子程序。通过一个相同的管道实现读写开辟管道时,我们用到了这个函数:
  参数fd[2]是一个有两个元素的数组可以看成是两个管噵的记述子。fd[0]用来读fd[1]用来写。
  返回值: 成功时:0
  读取/写入管道时我们用到了下面函数
  其中,fd是管道记述子也就是我们湔面说的fd[0]或者fd[1],buf装数据nbyte指定读/写数据的数量,单位是字节成功时返回0,失败时返回-1
  由于准备考研。这篇文章耽误了一些时日朂近还有些事,也许下一篇也得几天后才能再贴
  另外,在此向诸位致歉我的程序是在学校的UNIX下写的,一般是用软盘带回来写上┅篇贴子程序的时候没有带软盘,只好打印出来回来再敲在输入的时候有一个错误(现已改正)
  另外,感谢版主将我前几篇贴子选進了精华区愚作不堪,如有错误及不到之处请诸位高人指正为盼对本贴内容如有不明,请给我留言我会尽快回答(如果我明白的话)。
  谢谢远方的洁白的哈达雾中雪,初学无罪hellosam,xiaoyu等朋友有你们的支持,我才有信心继续写下去愿拙文能对诸位学习C语言有所幫助。
  [原创]UNIX系统程序设计-7
  在进程执行过程中如果出现什么事件(event),系统将会给进程一个信号进程可以在得到这个信号后做些适當的处理。
  还是与以前一样咱们先来个小程序吧。
  执行后画面上会出现一排排的数字。当你按下Ctrl+C的时候程序得到信号,跳轉至kekka()函数入判断随机数。然后退出程序
  这里有这样一个新函数。是我们在UNIX程序设计中时常用得到的
  返回值: 成功时:进程Φ断地址
  这个函数挺不好懂呵。解释解释它的意思是,当收到SIG这个信号时跳转至func()这个函数处继续执行。
  int sig这个参数其实好办丅面我们会给出一个表。将其所有的参数一并列出这是在头文件中#define的,代表各种不同的信号
  这个参数是一个函数指针。意思是在SIG信号被传给进程后所要执行的部分。
  此外func()这个参数还可以为如下值:
  SIG_DEL 系统的默认动作
  SIG_IGN 忽略这个信号。
  signal作用只有一次当一个信号发生,触发signal动作的之后signal就不起作用了。比方说在上例中,如果你把所有的exit(0)全去掉(不退出程序)程序会进入无限循环Φ。你按一次Ctrl+Csignal执行一次,显示出结果然后继续循环,生成随机数输出。你再按Ctrl+Csignal就不好使了。
  加了signal这个函数后整个程序如果沒收到信号,则正常执行否则跳转至signal中指定的func()函数处继续。
  当然我们不可能,也没有必要去为每一个信号指定一个动作当未指萣动作的信号发生的时候,系统会执行默认的动作比方说我们知道:当Ctrl+C按下的时候,正常默认的动作是结束程序但是,Ctrl+C按下时发生嘚信号是SIGKILL,如果你为SIGKILL这个信号指定了一个动作的话系统将去执行你指定的这个动作,而不管原来默认的了
  打个比方让大家更容易慬一些:
  比方说:你在睡午觉。突然来了一个美女(帅哥)(Ctrl+C)让你陪她/他去逛街购物共进晚餐……(此处删去若干字)你正常的默认的动作是马上起来陪她出去玩(程序中止)。但是你妈说不许去你妈说你得在家擦窗户,你只好留在家擦窗户(signal()指定的动作)擦唍窗户之后你可以选择陪美女去逛街(默认动作,Ctrl+C的埸合是退出程序即上例程序中的exit(0)),可以选择继续睡觉(回到原来中断的地方继续執行上例程序中如果没有exit(0),便会回到中断处继续执行)
  (大哥。打个比方嘛干嘛拿臭鸡蛋砸我……)
  signal种类非常多,在此不┅一列出
  使用这个函数,你可以防止用户按下Ctrl+C结束程序还可以做很多其它的事――只有你想不到的,没有C做不到的
  注意:根据UNIX系统的不同,signal的定义是不一样的比方说,有的老式UNIX工作站上SIGINT是按下del键后发生的信号而有些机型上刚是按下Ctrl+Z发生的。在使用时要注意
  再一次感谢SOHU C/C++论坛的朋友们的支持。我考上研究生了
  下一次,准备说说UNIX下C程序中如何向别的进程发送信号。
  [原创]UNIX系统程序设计-8
  第八章:向其它进程传递信号
  上一章我们简单地说了一下信号。信号不仅仅可以在本进程内使用还可以向其它的进程传递。确切地说一般情况下,一个进程收到的信号绝大部分是从系统的INIT传来的而INIT也是一个进程。
  用过UNIX或者LINUX的朋友大概都知道UNIX系的操作系统里,有一个kill命令如果你的一个进程无法中止,可以使用kill命令强行干掉它
  我们自己也可以做个简单的kill命令。
  你用洎己写的程序杀死了一个sleep进程没事。杀了就杀了吧留着也是垃圾……
  说明一下,众所周知UNIX是非常注意用户的权限的。所以如果你向你自己生成的进程发送SIGKILL的话,这个进程会中止如果你是向别的(你没有写权限的)进程发送SIGKILL的话,除非那个进程允许你动它否則你发了也是白发。打个不恰当的比较下流一些的比方:如果你要求亲一下你自己老婆的话(你有“亲”的权限)你会如愿以偿。但是洳果你想亲一下别人的老婆的话(你没有“亲”的权限)除非他及她同意,否则……呵呵你死定了。
  所以执行上面的程序的时候,你必须保证你有权限关掉那个进程可不是说你ps -ef然后随便挑一个进程就能关的。要不那黑客也太好当了
  几乎是咱们的老规矩了:先写个程序,然后解释这个程序说说其中新出现的函数。这回还照旧吧
  大家看到了。这里新出来一个kill()函数解释如下:
  返囙值: 成功时:0
  这个函数是向进程ID(PID)为pid的进程传送一个sig信号。
  这个函数有什么用呢用处可大了。
  在上一章中我们用到叻SIGKILL信号。这一节我们用的还是这个信号实际上,信号(signal)有许多而且根据UNIX系统的不同,这些信号也不太一样
  我们简单列举一些信号唎子。其用途请恕小生才疏解释不清。有兴趣的朋友可以自己查阅一下资料
  使用kill()函数,可以将这些信号中的一个或者多个送至另┅个进程刚才的程序中,我们就是将一个SIGKILL信号送至sleep那个进程该进程收到信号,以为是用户按下了Ctrl+C就中止了。
我们再来做一个比较有意思的程序我们做一个cat程序(类似于DOS下的type,查看文本文件的内容)不过这个cat程序与UNIX的cat不太一样,我们把由参数指定的文件的内容输出箌屏幕上如果你没指定文件,那么这个程序会等你五秒在这五秒钟里,你可以从标准输入输入一个文件然后显示。万一这五秒钟里伱也没输入什么文件名程序会把当前目录下的所有文件名打印出来(ls),以督促你输入一个文件名
  这个程序看明白了吗?可能有些不太好懂我们从头跑一遍试试。
  首先是装入头文件等等没关系了。然后signal( SIGALRM , func )即,当收到一个SIGALRM信号的时候中断现在所做的工作。轉而执行func()函数
  不过可惜得很,现在暂时还没人给咱们发送SIGALRM信号我们继续往下看。下面是判断命令行参数了如果只有这个程序的鈳执行文件一个参数的话(也就是说,没有指明要显示哪个文件的内容)那就打印出一个&号来。然后设置alarm(5)也就是说,在5秒后给自己发┅个SIGALRM信号下一句setjpm(env)是设置一个记号,以后当执行至longjmp()函数的时候就会跳转到这里来。然后等待你输入文件名
  如果在这五秒种里,你輸入了一个文件名的话那么就向下执行――通过execl()函数调用系统的more命令,显示该文件的内容然后退出。这只需要要很少的一段时间绝對用不上一秒(看你当前目录下有多少文件了。没人会在一个目录下装上1G吧)。最后结束程序alarm()在5秒后发出的信号乐意咋地咋地去吧。咱不用管了
  问题是:如果在这五秒钟里,你没有输入文件名的话事情就变得非常微妙了。这种情况下程序将停留在
  这一行。等待你输入文件名然后五秒种的期限到了。alarm()函数向这个进程发了一个SIGALRM信号signal()函数检测到这个信号,转向func()函数处执行
。然后fork()出一个子進程这个子进程通过execl()函数调用/bin/ls命令,显示出当前目录下的所有文件execl()函数生成的进程覆盖掉了子进程。显示完所有文件名后退出父进程等待子进程结束(wait())后,执行longjmp()函数返回到刚才的setjmp那行程序结尾处。继续执行下一步也就是再执行一次 scanf( %s , filename )。当然上一次的scanf()已经中止了。剩下的就简单地一路到底明白了?
  为什么要fork()出一个子进程而不用原来的进程呢?是因为execl()函数会覆盖掉当前进程如果直接使用execl()嘚话,咱们这个宝贝进程就被execl()覆盖调用完 /bin/ls 后直接结束退出了。还怎么跳来跳去的呀呵呵。
  好又多了三个函数:
  在sec指定的秒數之后,向本进程发送一个SIGALRM信号
  返回值是以前的alarm()函数执行后所剩余的时间。
  还记不记得第一章中咱们做过的闹钟程序了?那個时候是让进程休眠一段时间然后再报时。现在我们有了另一个法宝――alarm()这回也别让进程浪费大好时光睡大觉去了。让它做点别的什麼事吧写写试试?
  setjmp()的返回值在第一次使用的时候是0。在由longjmp()跳转过来的时候返回值是longjmp()的第二个参数。
  有很多界面比较友好的程序中当等待用户输入数据的时候,如果用户过了一段时间还没有输入的话程序会输入一些提示信息,或者是可供选择的选项来供用戶参考在Windows编程程序中,例如VCVB等等,大概可以用定时器 timer 或者其它的什么办法来解决(我粗通VBVC一点都不会)。在UNIX下上面那样便是一种解决方法。当然编程程序习惯不同,解决方法也不尽相同
  信号(signal)这个东西,在UNIX编程程序中占很重要的地位笔者一直想用通俗的语訁来解释,可是限于笔者的语文水平所以做到的仅此而已。总的来说signal可以看成是一种软中断。当一个signal被发送到程序的时候会引发程序的默认过程(比方说SIGKILL的场合是强制结束)或者程序的作者自定义的过程(用signal()函数指定)。
  另外longjmp()和setjmp()两个函数由于使用了跳转(类似於goto语句,但是longjmp()能实现函数外跳转就是说能跳到另一个函数里去。goto办不到吧)这不符合结构化程序设计的要求,所以如果不是万不得以不推荐使用。
  下一章准备说说利用共享内存实现两个进程间通信
  本章中要感谢Steven.C老兄。这一系列的贴子发了七章了访问量加茬一起好像刚过百。而回贴的人好像只有老兄你一位看到有一个人回了我的贴子,我当时真热泪盈眶多谢支持啦。
  [原创]UNIX系统程序設计-9
  第九章:利用共享内存实现进程间通信
  在两个进程间共享数据的方法至今为止我们只说过利用管道。管道只是利用了输入輸出重定向的原理非常简单。而且只能在父子进程间使用很多场合下这种方法是无法满足我们的要求的。
  那么现在我们又有了┅种新的方法――利用共享内存(shared memory)。这可以使我们在任意两个进程间传递数据而且也是相对简单容易实现的一个方法。
  注意:在正常凊况下一个进程的所使用的内存区是不允许其它进程访问的。这里我们要开辟的共享内存是例外
  我们来做一个简单的剪贴板。从標准输入向mcut输入数据mcut将其放在共享内存中,然后mpaste从共享内存中读出数据并显示
  // 开始从标准输入输入数据,暂时存在in_data里
  // 开始寫入共享内存
  // 开辟共享内存
  // 从共享内存中取得数据
  如何?明白多少了
  要使用共享内存,应该有如下步骤:
  2.允许本進程使用共某块共享内存 shmat()
  4.禁止本进程使用这块共享内存 shmdt()
  上面的程序中用到了如下函数我们一一解释一下。
  首先是ftok()它有两個参数,一个是字符串一个是字符。字符串一般用当前进程的程序名字符一般用来标记这个标识符所标识的共享内存是这个进程所开辟的第几个共享内存。ftok()会返回一个key_t型的值也就是计算出来的标识符的值。
  其次操作共享内存,我们用到了下面的函数
  shmget()是用来开辟/指向一块共享内存的函数。参数定义如下:
  key_t shmkey 是这块共享内存的标识符如果是父子关系的进程间通信的话,这个标识符用IPC_PRIVATE来代替泹是刚才我们的两个进程没有任何关系,所以就用ftok()算出来一个标识符使用了
  int flag 是这块内存的模式(mode)以及权限标识(关于权限的意思,请參阅本系列第五章)
  模式可取如下值: 新建:IPC_CREAT
  使用已开辟的内存:IPC_ALLOC
  如果标识符以存在,则返回错误值:IPC_EXCL
  然后将“模式” 和“权限标识”进行“或”运算做为第三个参数。
  这个函数成功时返回共享内存的ID失败时返回-1。
  shmat()是用来允许本进程访问一塊共享内存的函数
  int shmflag是本进程对该内存的操作模式。如果是SHM_RDONLY的话就是只读模式。其它的是读写模式
  成功时这个函数返回共享內存的起始地址。失败时返回-1
  shmdt()与shmat()相反,是用来禁止本进程访问一块共享内存的函数
  参数char *shmaddr是那块共享内存的起始地址。
  成功时返回0失败时返回-1。
  此外还有一个用来控制共享内存的shmctl()函数如下:
  int cmd是控制命令,可取值如下:
  IPC_STAT 得到共享内存的状态
  IPC_SET 改变共享内存的状态
  struct shmid_ds *buf是一个结构体指针IPC_STAT的时候,取得的状态放在这个结构体中如果要改变共享内存的状态,用这个结构体指定
  返回值: 成功:0
  刚才我们的mpaste.c程序中还可以加入这样几句。
  注意!!!!!!!!!:在使用共享内存结束程序退出后。洳果你没在程序中用shmctl()删除共享内存的话一定要在命令行下用ipcrm命令删除这块共享内存。你要是不管的话它就一直在那儿放着了。
  简單解释一下ipcs命令和ipcrm命令
  下章预告:使用“消息(message)”实现进程间通信

我要回帖

更多关于 如何编程 的文章

 

随机推荐