C++程序员需要了解的知识

1、工作中如何处理内存泄露?

2、工作中如何处理死锁;

3、如何在linux下编写SHELL 并查找目录以及子目录

4、如何处理Linux下DUMP文件

1. C++编译器自动为类产生那几个缺省函数?

默认构造函数、拷贝构造函数、析构函数、赋值操作符、取地址操作符、const取地址操作符。

2. 使用C++默认的赋值操作符,那些数据成员会发生错误?


对于内置类型,默认的赋值操作符是内存拷贝的方式,对于非内置类型则调用该类的赋值操作符,所以是浅拷贝,是错误的。

3. windows和linux进程同步的方法?


/********************************Windows***********************************/
/********************************Windows***********************************/
进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。 多进程/多线程是Windows操作系统的一个基本特征。Microsoft Win32应用编程接口(Application Programming Interface, API) 提供了大量支持应用程序间数据共享和交换的机制,这些机制行使的活动称为进程间通信(InterProcess communicati on, IPC),进程通信就是指不同进程间进行数据共享和数据交换。
  正因为使用Win32 API进行进程通信方式有多种,如何选择恰当的通信方式就成为应用开发中的一个重要问题, 下面本文将对Win32中进程通信的几种方法加以分析和比较。

1)进程间通信方式

具体http://blog.csdn.net/xcw_1987/article/details/58626443

  Win32 API为应用程序实现进程间通信提供了如此多种选择方案,
那么开发者如何进行选择呢?通常在决定使用哪种IPC方法之前应考虑以下一些问题:
(1)应用程序是在网络环境下还是在单机环境下工作。

方法一:WM_COPYDATA

HWND hReceiveDataWindow = FindWindow(NULL,....) 
COPYDATASTRUCT data; 
data.cbdata = strlen(pStr); 
data.lpData = pStr; 
SendMessage(hReceiveDataWindow ,WM_COPYDATA,(WPARAM)GetFocus(),(LPARAM)&data); 
REF.最简单的方式 

http://www.cppblog.com/TechLab/archive/2005/12/30/2272.aspx

方法二:dll共享

#pragma data_seg (".ASHARE") 
int iWhatYouUseInTwo = 0; 
#pragma data_seg() 

方法三:映象文件
REF.最基础,效率最高的方法
最好的参考书《Windows核心编程》第17章 内存映射文件
http://blog.codingnow.com/2005/10/interprocess_communications.html

方法四:匿名管道:CreatePipe
方法五:命名管道:createnamedpipe
REF.
http://www.pediy.com/bbshtml/bbs8/pediy8-724.htm

方法六:邮件通道

方法七:网络接口,socket,但要求有网卡。可以实现不同主机间的IPC
另一篇总结的比较好的文章
http://www.seeitco.com/doc/Html/Visual%20C++/205637623.html

进程通常被定义为一个正在运行的程序的实例,它由两个部分组成:
一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方
另一个是地址空间,它包含所有的可执行模块或DLL模块的代码和数据。它还包含动态分配的空间。
如线程堆栈和堆分配空间。每个进程被赋予它自己的虚拟地址空间,当进程中的一个线程正在运行时,该线程可以访问只属于它的进程的内存。
属于其它进程的内存则是隐藏的,并不能被正在运行的线程访问。
为了能在两个进程之间进行通讯,由以下几种方法可供参考:

0。剪贴板Clipboard: 在16位时代常使用的方式,CWnd中提供支持

1。窗口消息 标准的Windows消息以及专用的WM_COPYDATA消息 SENDMESSAGE()接收端必须有一个窗口

2。使用共享内存方式(Shared Memory)
a.设定一块共享内存区域

HANDLE CreateFileMapping(HANDLE,LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD, LPCSTR) 

产生一个file-mapping核心对象

LPVOID MapViewOfFile( 
HANDLE hFileMappingObject, 
DWORD dwDesiredAcess, 
DWORD dwFileOffsetHigh, 
DWORD dwFileOffsetLow, 
DWORD dwNumberOfBytesToMap 
); 

得到共享内存的指针
b.找出共享内存
决定这块内存要以点对点(peer to peer)的形式呈现
每个进程都必须有相同的能力,产生共享内存并将它初始化。每个进程
都应该调用CreateFileMapping(),然后调用GetLastError().如果传回的
错误代码是ERROR_ALREADY_EXISTS,那么进程就可以假设这一共享内存区 域已经被别的进程打开并初始化了,否则该进程就可以合理的认为自己 排在第 一位,并接下来将共享内存初始化。
还是要使用client/server架构中
只有server进程才应该产生并初始化共享内存。所有的进程都应该使用

HANDLE OpenFileMapping(DWORD dwDesiredAccess, 
BOOL bInheritHandle, 
LPCTSTR lpName); 
再调用MapViewOfFile(),取得共享内存的指针 
c.同步处理(Mutex) 
d.清理(Cleaning up) BOOL UnmapViewOfFile(LPCVOID lpBaseAddress); 
CloseHandle() 

3。动态数据交换(DDE)通过维护全局分配内存使的应用程序间传递成为可能
其方式是再一块全局内存中手工放置大量的数据,然后使用窗口消息传递内存 指针.这是16位WIN时代使用的方式,因为在WIN32下已经没有全局和局部内存
了,现在的内存只有一种就是虚存。

4。消息管道(Message Pipe)
用于设置应用程序间的一条永久通讯通道,通过该通道可以象自己的应用程序
访问一个平面文件一样读写数据。
匿名管道(Anonymous Pipes)
单向流动,并且只能够在同一电脑上的各个进程之间流动。
命名管道(Named Pipes)
双向,跨网络,任何进程都可以轻易的抓住,放进管道的数据有固定的格 式,而使用ReadFile()只能读取该大小的倍数。
可以被使用于I/O Completion Ports

5 邮件槽(Mailslots)
广播式通信,在32系统中提供的新方法,可以在不同主机间交换数据,在 WIN9X下只支持邮件槽客户

6。Windows套接字(Windows Socket)
它具备消息管道所有的功能,但遵守一套通信标准使的不同操作系统之上的应 用程序之间可以互相通信。

7。Internet通信 它让应用程序从Internet地址上载或下载文件

8。RPC:远程过程调用,很少使用,因其与UNIX的RPC不兼容。

9。串行/并行通信(Serial/Parallel Communication)
它允许应用程序通过串行或并行端口与其他的应用程序通信

10。COM/DCOM

通过COM系统的代理存根方式进行进程间数据交换,但只能够表现在对接口

函数的调用时传送数据,通过DCOM可以在不同主机间传送数据。
/********************************end***********************************/

*******************************LINUX******************************

Linux下进程间通信的六种机制详解
linux下进程间通信的几种主要手段:
1.管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
2.信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期 信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上, 该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,sigaction函数重新实现了signal函数);
3.报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
4.共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针其他通信机制运行效率较低设计的。往往与其它通信机制,如信号量结合使用, 来达到进程间的同步及互斥。
5.信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
6.套接字(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix 系统上:Linux和System V的变种都支持套接字。
转载http://www.cnblogs.com/melons/p/5791796.html ————后续包含详解

4. 进程间同步

进程互斥
概念:临界区 临界资源 间接制约 互斥 信号量 P操作 V操作

1.临界区:不允许多个并发进程执行的一段程序称为临界资源。
临界资源:把一次(一段时间内)仅允许一个进程使用的资源称为临界资源。
分析与总结:——由于读写数据的顺序性导致。

2.间接制约:由共享公有资源而造成的对并发进程执行速度的间接制约。
分析与总结:——时间决定效率

3.互斥:一组并发进程中的一个或多个程序段,因共享某一公有的资源而导致它们必须以一个不允许交叉执行的单位执行。即不允许两个以上的共享该资源的进程同时进入临界区。
分析与总结:——比喻成一个独木桥。

4.互斥发生的五条基本原则:
有空让进(空闲让进),忙则等待,多中选一,有限等待,让权等待(即等待的进程应该主动放弃CPU)。
分析与总结——白话:如果临界资源是空的,那么就让一个进程使用(有空让进),从哪里选呢?从等待队列中选择一个咯(多中选一);如果没有空闲的话呢?就等待咯!不要一直等,很烦的(有限等待),还不能一直占用茅坑而不解放(让权等待)。

5.原语:是在管态下执行、完成系统特定功能的过程。不允许中断,是一个不可分割的单位,执行的顺序不可以是并发,而是顺序的。
分析与总结:——类似机器指令。

6.信号量:一个整数,正数表示可供并发进程使用的资源数,负数的绝对值表示等待使用临界区的进程数。
Struct Sem
{
Int value;
Pointer_PCB queue;
};
体会:是一个变量,这个变量的作用好牛逼,可以表示某个进程使用,表示等待资源的个数。而且是一个公用的变量(标志着临界资源与进程之间的关系)。

7.P操作:信号量减一,表示申请临界资源,如果小于零,进入等待队列。见图P原语操作功能:
8.V操作:信号量加一,表示当前进程释放临界资源,如果小于等于零,则唤醒一个等待的进程。见图V原语操作功能:
这里写图片描述

类似于生产者和消费者。仍然是针对临界区提出的。时间的控制。

1.进程的同步:把异步环境下的一组并发进程,因直接制约而互相合作,互相等待,使得各进程按一定的速度运行的过程称为进程间的同步。
分析与总结:模拟生产者和消费者,前提:生产和消费共享一个区域。要生产,得有地方才行,即消费的释放;要消费,要已经生产好了才行。

2.合作进程以其消息:具有同步关系的一组并发进程称为合作进程,合作进程间互相发送的信号称为消息或事件。如:
wait (消息名) signal (消息名)

3.私用信号量:只与两组进程有关,制约的和被制约的。如full,empty。
公用信号量:互斥时使用的信号量。如Semaphore。
都是对立的分析。

4.利用P,V原语实现进程同步的方法:
(1)首先为各并发进程设置私用信号量,总结:一般是对立的变量。
(2)然后为私用信号量赋初值,总结:一般是和为定值,一个为0,一个为N
(3)最后利用P,V原语和私用信号量规定各进程的执行顺序 。
总结:考虑两个方面,一是如何传递私有信号,以实现同步;另一是如何设置公有信号量,以实现进程的互斥。

5.同步例题

这里写图片描述

解答:
(1).设Buffempty为进程Pa的私用信号量,Buffull为进程Pb的私用信号量。(对立关系)。
(2).令Buffempty的初始值为N(N为缓冲队列的缓冲区个数),Buffull的初始值为0。(对立关系的初值,总和不变)。
(3).描述:
Pa: deposit(data):
Begin local x //x表示一个缓冲区块的地址。
P(Buffempty);
按FIFO方式选择一个空缓冲区 BUF(X);
BUF(X)=data;
BUF(X)置满标记
V(Buffull)
End

Pb: remove(data):
Begin local x
P(Buffull);
按FIFO方式选择一个装满的空缓冲区 BUF(X);
data =BUF(X);
BUF(X)置空标记
V(Bufempty);
End

6.由于有界缓冲区时临界资源,各生产者和各消费者进程之间必须互斥执行,即要设置公用信号量。——生产者和消费者问题
这里写图片描述
转载于http://blog.163.com/art_budder_niu/blog/static/13936462020105259526831/

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值