随笔分类 -  Linux

摘要:在Unix进程中涉及多个用户ID和用户组ID,包括如下:1、实际用户ID和实际用户组ID:标识我是谁。也就是登录用户的uid和gid,比如我的Linux以simon登录,在Linux运行的所有的命令的实际用户ID都是simon的uid,实际用户组ID都是simon的gid(可以用id命令查看)。2... 阅读全文
posted @ 2014-04-29 18:28 拦云 阅读(26705) 评论(0) 推荐(3) 编辑
摘要:我们知道,进程在各自独立的地址空间中运行,进程之间共享数据需要用mmap或者进程间通信机制,有些情况需要在一个进程中同时执行多个控制流程,这时候线程就派上了用场,比如实现一个图形界面的下载软件,一方面需要和用户交互,等待和处理用户的鼠标键盘事件,另一方面又需要同时下载多个文件,等待和处理从多个网络主机发来的数据,这些任务都需要一个“等待-处理”的循环,可以用多线程实现,一个线程专门负责与用户交互,另外几个线程每个线程负责和一个网络主机通信。信号处理函数是同一个进程地址空间中的多个控制流程,多线程也是如此,但是比信号处理函数更加灵活,信号处理函数的控制流程只是在信号递达时产生,在处理完信号之后就 阅读全文
posted @ 2014-03-22 23:59 拦云 阅读(935) 评论(0) 推荐(0) 编辑
摘要:信号(signal)机制是UNIX系统中最为古老的进程之间的通信机制,它用在一个或多个进程之间传递异步信号,信号可以由各种异步事件产生,如:键盘中断等等,在Linux 的shell 中,也可以使用信号将作业控制命令传递给它的子进程。在linux系统中,定义了一系列的信号,这些信号可以由内核产生,也可以有系统中的其他进程产生,只要这些进程的权限足够大。进程可以屏蔽掉大多数的信号,除了SIGSTOP和SIGKILL,前者使一个正在运行的进程暂停,后者则使一个正在运行的进程退出。应用程序收到信号后,有三种处理方式:忽略,默认,或捕捉。进程收到一个信号后,会检查对该信号的处理机制。如果是SIG_IGN 阅读全文
posted @ 2014-03-22 21:46 拦云 阅读(397) 评论(0) 推荐(0) 编辑
摘要:linux进程间通信(IPC)包括3种机制:消息队列、信号量、共享内存。消息队列和信号量均是内核空间的系统对象,经由它们的数据需要在内核和用户空间进行额外的数据拷贝;而共享内存和访问它的所有应用程序均同处于用户空间,应用进程可以通过地址映射的方式直接读写内存,从而获得非常高的通信效率。在GNU/Linux中所有的进程都有唯一的虚拟地址空间,而共享内存应用编程接口API允许一个进程使用公共内存区段。如果使用消息队列进行通信,那么一个进程要向队列中写入消息,这要引起从用户地址空间向内核地址空间的一次复制,同样一个进程进行消息读取时也要进行一次复制,而共享内存的优点是完全省去了这些操作。两个不同进程 阅读全文
posted @ 2014-03-19 22:09 拦云 阅读(1160) 评论(0) 推荐(0) 编辑
摘要:信号量当我们在多用户系统,多进程系统,或是两者混合的系统中使用线程操作编写程序时,我们经常会发现我们有段临界代码,在此处我们需要保证一个进程(或是一个线程的执行)需要排他的访问一个资源。信号量有一个复杂的编程接口。幸运的是,我们可以很容易的为自己提供一个对于大多数的信号量编程问题足够高效的简化接口。为了阻止多个程序同时访问一个共享资源所引起的问题,我们需要一种方法生成并且使用一个标记从而保证在临界区部分一次只有一个线程执行。线程相关的方法,我们可以使用互斥或信号量来控制一个多线程程序对于临界区的访问。编写通用目的的代码保证一个程序排他的访问一个特定的资源是十分困难的,尽管有一个名为Dekker 阅读全文
posted @ 2014-03-19 16:13 拦云 阅读(775) 评论(0) 推荐(0) 编辑
摘要:消息队列是内核地址空间中的内部链表,通过linux内核在各个进程之间传递内容,消息顺序地发送到消息队列中,并且以几种不同的方式从队列中获取,每个消息队列可以用IPC标识符唯一的进行标识,内核中的消息队列是通过IPC的标识符来区别的,不同的消息队列之间是相互独立的,每个消息队列中的消息又构成一个独立的链表.消息队列中的数据结构1、消息缓冲结构向消息队列发送消息时,必须组成合理的数据结构。Linux系统定义了一个模版数据结构msgbuf:#includestruct msgbuf{long type;char mtext[1];}其中type表示消息的类型,以正数表示。mtext是该消息的数据,并 阅读全文
posted @ 2014-03-18 19:53 拦云 阅读(16879) 评论(2) 推荐(1) 编辑
摘要:管道是一种把两个进程之间的标准输入和标准输出连接起来的机制,从而提供一种让多个进程间通信的方法,当进程创建管道时,每次都需要提供两个文件描述符来操作管道。其中一个对管道进行写操作,另一个对管道进行读操作。对管道的读写与一般的IO系统函数一致,使用write()函数写入数据,使用read()读出数据。#includeint pipe(int filedes[2]);返回值:成功,返回0,否则返回-1。参数数组包含pipe使用的两个文件的描述符。fd[0]:读管道,fd[1]:写管道。必须在fork()中调用pipe(),否则子进程不会继承文件描述符。两个进程不共享祖先进程,就不能使用pipe。但 阅读全文
posted @ 2014-03-18 16:43 拦云 阅读(128572) 评论(3) 推荐(5) 编辑
摘要:一、fork入门知识一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。 我们来看一个例子:/**fork_test.c*version1*Createdon:2010-5-29*Author:wangth*/#include#includeintmain(){ 阅读全文
posted @ 2014-03-18 12:40 拦云 阅读(965) 评论(0) 推荐(0) 编辑
摘要:在linux下用文件描述符来表示设备文件盒普通文件,文件描述符是一个整型的数据,所有对文件的操作都是通过文件描述符来实现的。文件描述符是文件系统中连接用户空间和内核空间的枢纽,当我们打开一个或者创建一个文件时,内核空间会创建相应的结构,并且生成一个整型的变量传递给用户空间的对应进程,而进程则用这个文件描述符来对文件进行操作。要注意的是,文件描述符是一个有限的资源,因此,在使用完毕后要及时释放,一般是调用close()函数来关闭的。在linux系统中有3个已经分配好的文件描述符,那就是标准输入,标准输出和标准错误,他们的文件描述符分别为0,1,2.1.open() ,create()函数在lin 阅读全文
posted @ 2014-03-17 20:56 拦云 阅读(7624) 评论(0) 推荐(0) 编辑
摘要:Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions)。可以参考《Linux程序设计》(英文原版为《Beginning Linux Programming》,作者是Neil Matthew和Richard Stones)第三章: Working with files。系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思。面向的是硬件。而库函数调用则面向的是应用开发的,相当于应用程序的api,采用这样的方式有很多种原因,第一:双缓冲技术的实现。第二,可移植性。第三,底层调用本身的一些性能方面的缺陷。第四: 阅读全文
posted @ 2014-03-16 17:31 拦云 阅读(479) 评论(0) 推荐(0) 编辑
摘要:GDB是一套字符界面的程序集,可以用它在linux上调试C和C++程序,它提供了以下的功能:1 在程序中设置断点,当程序运行到断点处暂停2 显示变量的值,可以打印或者监视某个变量,将某个变量的值显示出来3 单步执行4 运行时修改变量的值5 跟踪路径6 线程切换等等下面以以下程序为例当我们要使用GDB进行程序的调试时,在用GCC编译时需要加上-g,如下:GDB之所以能够进行程序的调试也是在于进行编译时的-g选项,当设置了这个选项的时候,GCC会向程序中塞入一下信息,作为GDB调试时的铺垫,然后GDB才能够利用这些铺垫和信息与程序交互。有两种方式可以进入GDB,一种就是直接在命令行上输入gdb,然 阅读全文
posted @ 2014-03-16 13:14 拦云 阅读(23136) 评论(0) 推荐(2) 编辑
摘要:GNU/Linux操作系统架构备注:IPC进程间通。IPC(Inter-Process Communication)是共享"命名管道"的资源,它是为了让进程间通信而开放的命名管道, 通过提供可信任的用户名和口令,连接双方 可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问 下面简要的分析linux内核的各个组件1.GNU系统库,即glibc库,它是一个实现标准C库函数的可移植的库,包括上半个系统的调用。应用程序与GNU C库连接来访问Linux内核和一些常用函数。GNU C和ANSI C函数库的区别:libc是Linux下的ANSI... 阅读全文
posted @ 2013-07-11 10:15 拦云 阅读(1163) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示