【Linux环境编程】
Mike江
A goal is not always meant to be reached, it often serves simply as something to aim at. ──Bruce Lee
目标不一定是需要达到的,目标往往只是用来帮助你瞄准方向。──李小龙
展开
-
Linux系统编程——文件描述符的复制:dup()和dup2()
dup() 和 dup2() 是两个非常有用的系统调用,都是用来复制一个文件的描述符,使新的文件描述符也标识旧的文件描述符所标识的文件。这个过程类似于现实生活中的配钥匙,钥匙相当于文件描述符,锁相当于文件,本来一个钥匙开一把锁,相当于,一个文件描述符对应一个文件,现在,我们去配钥匙,通过旧的钥匙复制了一把新的钥匙,这样的话,旧的钥匙和新的钥匙都能开启这把锁。对比于 dup(), dup2() 也一...原创 2015-05-20 16:54:36 · 147795 阅读 · 4 评论 -
Linux系统编程——特殊进程之孤儿进程
父进程运行结束,但子进程还在运行(未运行结束)的子进程就称为孤儿进程(Orphan Process)。孤儿进程最终会被 init 进程(进程号为 1 )所收养,并由 init 进程对它们完成状态收集工作。孤儿进程是没有父进程的进程,为避免孤儿进程退出时无法释放所占用的资源而变为僵尸进程(什么是僵尸进程,请看《特殊进程之僵尸进程》),进程号为 1 的 init 进程将会接受这些孤儿进转载 2015-05-25 15:03:27 · 32525 阅读 · 4 评论 -
Linux系统编程——线程同步与互斥:读写锁
当有一个线程已经持有互斥锁时,互斥锁将所有试图进入临界区的线程都阻塞住。但是考虑一种情形,当前持有互斥锁的线程只是要读访问共享资源,而同时有其它几个线程也想读取这个共享资源,但是由于互斥锁的排它性,所有其它线程都无法获取锁,也就无法读访问共享资源了,但是实际上多个线程同时读访问共享资源并不会导致问题。在对数据的读写操作中,更多的是读操作,写操作较少,例如对数据库数据的读写应用。为了满足当前能够允许多个读出,但只允许一个写入的需求,线程提供了读写锁来实现。原创 2015-06-14 10:23:02 · 38820 阅读 · 4 评论 -
Linux系统编程——进程同步与互斥:POSIX有名信号量
在 POSIX 标准中,信号量分两种,一种是无名信号量,一种是有名信号量。无名信号量一般用于线程间同步或互斥,而有名信号量一般用于进程间同步或互斥。它们的区别和管道及命名管道的区别类似,无名信号量则直接保存在内存中,而有名信号量要求创建一个文件。前面我们学习了无名信号量的使用(详情请看《无名信号量》),这里我们学习有名信号量的使用。原创 2015-06-15 16:24:07 · 198453 阅读 · 5 评论 -
Linux主流桌面环境简单介绍
概述:本文收集了在Linux操作平台下的几大最常用的桌面环境,分析了它们的利弊,方便你作出正确的选择。1)Unity是由Ubuntu系统的开发公司Canonical所开发的,用于它们的旗舰发行版。它运行在Gnome桌面环境上,并使用Gnome应用程序的所有内核。2)Gnome在与传统UI分道扬镳之后构建了更加现代化的桌面外观Gnome Shell 。Gnome以简洁著称,即便现在的Gnome Shell摒弃了以前的部分特性,但这一点仍然被继承了下来。通过第三方的扩展程序的帮助Gnome Shell的功能翻译 2015-07-04 09:58:48 · 5099 阅读 · 0 评论 -
Linux系统编程——线程同步与互斥:互斥锁
在多任务操作系统中,同时运行的多个任务可能都需要使用同一种资源。这个过程有点类似于,公司部门里,我在使用着打印机打印东西的同时(还没有打印完),别人刚好也在此刻使用打印机打印东西,如果不做任何处理的话,打印出来的东西肯定是错乱的。实际上,打印机是有做处理的,我在打印着的时候别人是不允许打印的,只有等我打印结束后别人才允许打印。这个过程有点类似于,把打印机放在一个房间里,给这个房间安把锁,这个锁默认是打开的。当 A 需要打印时,他先过来检查这把锁有没有锁着,没有的话就进去,同时上锁在房间里打印。而在这时,刚原创 2015-06-14 22:36:52 · 192632 阅读 · 8 评论 -
Linux系统编程——线程同步与互斥:POSIX无名信号量
信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于 0 时,则可以访问,否则将阻塞。PV 原语是对信号量的操作,一次 P 操作使信号量减1,一次 V 操作使信号量加1。信号量主要用于进程或线程间的同步和互斥这两种典型情况。原创 2015-06-15 00:25:35 · 116834 阅读 · 3 评论 -
Linux 开发环境搭建与使用——SlickEdit 的安装与配置
vim 是公认很好用很完美,但是对新手来说,上手毕竟不是很容易。Windows 下程序员很多都很喜欢 Source Insight 这个工具来看代码,各种语法高亮看着很舒服。那在 Linux 平台下,有没有媲美 Source Insight 的编辑器呢?答案就是 SlickEdit。SlickEdit 是一个跨平台(在 9 种不同的工作平台上可以工作)的, 支持超过 40 种编程语言的代码编辑器。原创 2015-05-28 17:56:40 · 14401 阅读 · 2 评论 -
Linux系统编程——进程间通信:共享内存
共享内存是进程间通信中最简单的方式之一。共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。1)共享内存是进程间共享数据的一种最快的方法。一个进程向共享的内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。2)使用共享内存要注意的是多个进程之间对一个给定存储区访问的互斥。若一个进程正在向共享内存区写数据,则在它做完这一步操作前,别的进程不应当去读、原创 2015-06-09 23:11:23 · 197967 阅读 · 2 评论 -
Linux系统编程——进程间通信:管道(pipe)
管道也叫无名管道,它是是 UNIX 系统 IPC(进程间通信) 的最古老形式,所有的 UNIX 系统都支持这种通信机制。每个管道只有一个页面作为缓冲区,该页面是按照环形缓冲区的方式来使用的。这种访问方式是典型的“生产者——消费者”模型。当“生产者”进程有大量的数据需要写时,而且每当写满一个页面就需要进行睡眠等待,等待“消费者”从管道中读走一些数据,为其腾出一些空间。相应的,如果管道中没有可读数据,“消费者” 进程就要睡眠等待。原创 2015-06-02 11:55:08 · 178900 阅读 · 1 评论 -
Linux系统编程——多线程实现多任务
每个进程都拥有自己的数据段、代码段和堆栈段,这就造成进程在进行创建、切换、撤销操作时,需要较大的系统开销。为了减少系统开销,从进程中演化出了线程。为了让进程完成一定的工作,进程必须至少包含一个线程。线程存在于进程中,共享进程的资源。更多详情,请看《进程和线程的区别与联系》。转载 2020-02-26 09:29:02 · 37336 阅读 · 9 评论 -
Linux开发环境搭建与使用——Linux简史
Linux从一个黑客的个人项目发展到一个遍布全球的操作系统,这一历程就象一次生物的进化。八十年代早期, Richard Stallman发起了GNU项目,为开源软件的发展奠定了基础。 Andrew Tanenbaum教授开发的MINIX系统,把操作系统的学习研究从单纯的理论教学带入到实践阶段。最终, Linus Torvalds用他追求完美的无尽热情催生了Linux。在过去的几年中,开源社区成千上万的人们不断地呵护滋养着它,谱写了计算机革命史册的光辉一页。今天, Linux不再是一个学生黑客的项目,它成了一翻译 2015-03-11 13:44:33 · 4854 阅读 · 2 评论 -
Linux开发环境搭建与使用——ubuntu更新设置
ubuntu操作系统发布时,为了减小操作系统的体积,仅仅配备了基本的系统软件、应用软件。我们开发中需要用到的大部分软件都需要在使用中从网上自行更新。如果ubuntu没有网络,可以说寸步难行。下面教大家一下如何使用互联网和局域网进行更新。互联网更新(外网更新)可以上网的虚拟机或物理机,直接可从互联网更新软件。ubuntu默认的更新源速度不是很快,我们可原创 2015-03-12 16:09:13 · 3627 阅读 · 0 评论 -
Linux 开发环境搭建与使用——Linux 编译器之 GCC
上一节我们学习了 vim 编辑器,接下来我们一起学习 gcc 编译器,这里,我们要区分编辑器和编译器有何不同?编辑器是指我用它来写程序的(编辑代码),而我们写的代码语句,电脑是不懂的,我们需要把它转成电脑能懂的语句,编译器就是这样的转化工具。就是说,我们用编辑器编写程序,由编译器编译后才可以运行!编译器是将易于编写、阅读和维护的高级计算机语言翻译为计算机能解读、运行的低级机原创 2015-04-07 16:34:29 · 7537 阅读 · 0 评论 -
同步和异步的区别
同步,可以理解为在执行完一个函数或方法之后,一直等待系统返回值或消息,这时程序是出于阻塞的,只有接收到返回的值或消息后才往下执行其他的命令。 异步,执行完函数或方法后,不必阻塞性地等待返回值或消息,只需要向系统委托一个异步过程,那么当系统接收到返回值或消息时,系统会自动触发委托的异步过程,从而完成一个完整的流程。 同步,就是实时处理(如打电话),比如服务器一接收客户端请求,马原创 2015-04-18 11:51:38 · 26907 阅读 · 4 评论 -
Linux系统编程——特殊进程之僵尸进程
在每个进程退出的时候,内核释放该进程所有的资源、包括打开的文件、占用的内存等。 但是仍然为其保留一定的信息,这些信息主要主要指进程控制块的信息(包括进程号、退出状态、运行时间等)。直到父进程通过 wait() 或 waitpid() 来获取其状态并释放(具体用法,请看《等待进程结束》)。 这样就会导致一个问题,如果进程不调用 wait() 或 waitpid() 的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导原创 2015-05-25 14:15:39 · 63733 阅读 · 1 评论 -
Linux系统编程——进程替换:exec 函数族
在 Windows 平台下,我们可以通过双击运行可执行程序,让这个可执行程序成为一个进程;而在 Linux 平台,我们可以通过 ./ 运行,让一个可执行程序成为一个进程。但是,如果我们本来就运行着一个程序(进程),我们如何在这个进程内部启动一个外部程序,由内核将这个外部程序读入内存,使其执行起来成为一个进程呢?这里我们通过 exec 函数族实现。原创 2015-05-26 14:36:23 · 90402 阅读 · 1 评论 -
Linux系统编程——进程间通信:命名管道(FIFO)
无名管道,由于没有名字,只能用于亲缘关系的进程间通信(更多详情,请看《无名管道》)。为了克服这个缺点,提出了命名管道(FIFO),也叫有名管道、FIFO 文件。命名管道(FIFO)不同于无名管道之处在于它提供了一个路径名与之关联,以 FIFO 的文件形式存在于文件系统中,这样,即使与 FIFO 的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过 FIFO 相互通信,因此,通过 FIFO 不相关的进程也能交换数据。原创 2015-06-02 15:38:35 · 78351 阅读 · 2 评论 -
Linux开发环境搭建与使用——Linux必备软件之Samba
假如我们是在ubuntu环境上做相应的开发,有的时候,我们需要把我们写的程序共享给别人,或者,自己拷贝出来备份一份。我们习惯用U盘拷贝,如果需要频繁拷贝的话,这样会不太方便。这里给大家介绍一种更好的方法:通过Samba服务器共享。Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。Samba服务器在两种不同操作系统间架起了一座原创 2015-03-12 20:44:45 · 4921 阅读 · 0 评论 -
Linux系统编程——进程同步与互斥:System V 信号量
信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于 0 时,则可以访问,否则将阻塞。PV 原语是对信号量的操作,一次 P 操作使信号量减1,一次 V 操作使信号量加1。在实际应用中两个进程间通信可能会使用多个信号量,因此 System V 的信号量以集合的概念来管理,具体操作和 Posix 信号量大同小异,详情请点此链接:http://blog.csdn.net/te原创 2015-08-20 19:22:20 · 165008 阅读 · 2 评论 -
Linux系统编程——进程和线程的区别与联系
在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么, 只是维护应用程序所需的各种资源,而线程则是真正的执行实体。为了让进程完成一定的工作,进程必须至少包含一个线程。进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己的地址空间,有自己的堆,上级挂靠单位是操作系统。操作系统会以进程为单位,分配系统资源,所以我们也说,进程是资源分配...原创 2015-05-27 14:48:04 · 14145 阅读 · 4 评论 -
vim-csupport
简介如果你还在为编写 c/cpp 过程中添加注释而烦恼的话,那么 vim 插件 csupport 就将会是你的好朋友了。csupport 除了提供快捷键添加注释块以外,还能够快速插入定义函数、预处理、当前日期等。安装和配置官网:http://www.vim.org/scripts/script.php?script_id=213 下载页面:https://github.com/W...原创 2017-11-14 11:20:30 · 3018 阅读 · 0 评论 -
阻塞、非阻塞IO
阻塞与非阻塞是对于文件而言的,而不是指read、write等的属性。阻塞IO应用程序调用IO函数,导致应用程序阻塞,等待数据准备好。如果数据没有准备好,一直等待数据准备好了,从内核拷贝到用户空间,IO函数返回成功指示。读常规文件是不会阻塞的,不管读多少字节,read一定会在有限的时间内返回。一般网络、终端设备IO都是阻塞I/O。如果从终端输入的数据没有换行符,调用read读...原创 2017-11-14 20:06:22 · 6351 阅读 · 0 评论 -
ubuntu下samba的配置和使用
Samba服务器在两种不同操作系统间架起了一座桥梁,使Linux系统和Windows系统之间能够通信。通过Linux操作系统下的samba服务,可以实现Windows主机访问Linux下共享文件的功能,为广泛的Linux爱好者提供了极大方便。1. samba服务器安装(1)在Ubuntu系统下面安装samba服务:sudo apt-get install samba (2)关闭U...原创 2017-12-11 14:57:38 · 11600 阅读 · 1 评论 -
ubuntu下添加新用户、解决远程登录问题
1 添加新用户1.1 添加新用户sudo useradd go -d /home/go -m#第一个go,指用户名#-d /home/go 指定用户登录系统时的主目录,宿主目录#-m 如果/home/go路径不存在,自动创建1.2 查看新建的用户cat /etc/passwd | grep go1.3 给新用户设置密码sudo pass...原创 2018-01-04 16:22:23 · 26269 阅读 · 8 评论 -
一步步学习Linux开发环境搭建与使用
00、Linux开发环境搭建与使用1——Linux简史01、Linux开发环境搭建与使用2——Linux系统(ubuntu)安装方案02、Linux开发环境搭建与使用3——通过虚拟机安装系统(ubuntu)03、Linux开发环境搭建与使用4——ubuntu更新设置04、Linux开发环境搭建与使用4——Linux必备软件之Samba05、Linux开发环境搭建与使用5——Linux必备软件之SS...原创 2015-03-18 15:13:57 · 138661 阅读 · 5 评论 -
一步步学习Linux多任务编程
系统调用01、什么是系统调用?02、Linux系统调用之I/O操作(文件操作)03、文件描述符的复制:dup(), dup2()多进程实现多任务04、进程的介绍05、Linux可执行文件结构与进程结构06、多进程实现多任务(一):fork()07、多进程实现多任务(二):vfork()08、进程的控制:结束进程、等待进程结束09、Linux特殊进程之僵尸进程10、Linux特殊进程之孤儿进程11、...原创 2015-06-04 10:56:55 · 207642 阅读 · 11 评论 -
Linux系统编程——线程池
线程池和传统的一个用户对应一个线程的处理方法不同,它的基本思想就是在程序开始时就在内存中开辟一些线程,线程的数目是固定的,他们独自形成一个类,屏蔽了对外的操作,而服务器只需要将数据包交给线程池就可以了。当有新的客户请求到达时,不是新创建一个线程为其服务,而是从“池子”中选择一个空闲的线程为新的客户请求服务,服务完毕后,线程进入空闲线程池中。如果没有线程空闲的话,就将数据包暂时积累, 等待线程池内有线程空闲以后再进行处理。通过对多个任务重用已经存在的线程对象,降低了对线程对象创建和销毁的开销。当客户请求 时,转载 2015-06-14 13:48:36 · 8431 阅读 · 2 评论 -
HTTP协议浅析(下): 使用HTTP协议实现通信
1. 概述服务器的开发不容易,尤其是开发高性能、稳定性好服务器,更加不容易,因此人们尝试更好简单的方式来开发软件。在服务器方面,使用Web服务器,采用HTTP协议来代替底层的socket,是常见的选择。采用HTTP协议更加除了能得到稳定的服务器支持外,更加可以兼容各种客户端(手机、PC、浏览器)等等。这样实现了一个服务器之后,多个客户端可以通用。2.通信过程HTTP 协议采用请求/响应模型。客户端向原创 2016-12-28 16:18:23 · 13904 阅读 · 4 评论 -
Linux系统编程——线程私有数据
在多线程程序中,经常要用全局变量来实现多个函数间的数据共享。由于数据空间是共享的,因此全局变量也为所有线程共有。但有时应用程序设计中必要提供线程私有的全局变量,这个变量仅在线程中有效,但却可以跨过多个函数访问。比如在程序里可能需要每个线程维护一个链表,而会使用相同的函数来操作这个链表,最简单的方法就是使用同名而不同变量地址的线程相关数据结构。这样的数据结构可以由 Posix 线程库维护,成为线程私有数据 (Thread-specific Data,或称为 TSD)。转载 2015-06-11 14:36:30 · 69999 阅读 · 2 评论 -
Linux 可执行文件结构与进程结构
Linux可执行文件结构在 Linux 下,程序是一个普通的可执行文件,以下列出一个二进制可执行文件的基本情况:可以看出,此可执行文件在存储时(没有调入到内容)分为代码区(text)、数据区(data)和未初始化数据区(bss)3 个部分。各段基本内容说明如下:代码区:存放 CPU 执行的机器指令。通常代码区是可共享的(即另外的执行程序可以调用它),使其可共享的目的是对原创 2015-04-19 10:15:38 · 6462 阅读 · 2 评论 -
Linux通过man手册查看ASCII
1)在终端下敲:man ascii2)跳入ascii的man查看手册界面中:3)在man手册字符界面中,通过键盘上下方向键翻页,按"q"即可退出。原创 2015-10-13 13:44:01 · 6533 阅读 · 0 评论 -
查看Linux内核和发行版本信息
查看内核版本:uname -a查看发行版:cat /etc/issue查看发行版:lsb_release -a本文转自:http://blog.csdn.net/hfw_1987原创 2015-10-26 17:23:24 · 2069 阅读 · 0 评论 -
通过gdb快速定位“段错误”的位置
有些时候我们在一段 C/C++ 代码的时候,由于对一个非法内存进行了操作,在程序运行的过程中,出现了段错误。遇到这种问题是非常无语的,只是提示了"段错误",接着什么都没有,如果我们一味的去看代码找太疼苦了,因为我们都相信自己写的代码没问题,现实就是现实。接着,我们可能通过打印来定位到段错误的位置,这样会有个问题,如果代码量大,我们需要打印很多信息才能找到“段错误”的位置(这种办法实在太笨了),而往往有些时候,“段错误”光靠打印不一定能找出来。接下来,给大家介绍通过gdb快速定位“段错误”的位置。原创 2015-09-12 21:05:13 · 7481 阅读 · 1 评论 -
线程堆栈大小的使用介绍
先来讲说线程内存相关的东西,主要有下面几条:进程中的所有的线程共享相同的地址空间。任何声明为 static/extern 的变量或者堆变量可以被进程内所有的线程读写。一个线程真正拥有的唯一私有储存是处理器寄存器。线程栈可以通过暴露栈地址的方式与其它线程进行共享。有大数据量处理的应用中,有时我们有必要在栈空间分配一个大的内存块或者要分配很多小的内存块,但是线程的栈空间的最大值在线程创建的时候就已经定原创 2015-09-27 17:35:21 · 11452 阅读 · 2 评论 -
如何使用Valgrind memcheck工具进行C/C++的内存泄漏检测
系统编程中一个重要的方面就是有效地处理与内存相关的问题。你的工作越接近系统,你就需要面对越多的内存问题。有时这些问题非常琐碎,而更多时候它会演变成一个调试内存问题的恶梦。所以,在实践中会用到很多工具来调试内存问题。Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它包含一个内核——一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等。V翻译 2015-09-23 19:16:02 · 12397 阅读 · 0 评论 -
虚拟机挂载到开发板的脚本文件,可以指定挂载目录,能自动设置开发板的ip
虚拟机挂载到开发板的脚步文件,可以指定挂载目录,能自动设置开发板的ip:echo -e "未占用IP\n">ip #把ip重定向到ip文件里,作为记录src=10.221.0.71:/home/wencong #虚拟机需要挂载的目录dest=/mnt #挂载到开发板的某个目录,这个为开发板的目录gw=10.221.20.254 #网关segment=10.221.2原创 2015-01-29 10:17:27 · 1442 阅读 · 0 评论 -
Linux开发环境搭建与使用——ubuntu物理机安装方法:U盘安装
前面教过了如果使用wubi在windows环境下安装ubuntu12.04,但是有些小伙伴希望真正感受一下ubuntu在物理机上安装,或者不想受到windows的限制,希望体验纯净的ubuntu体验,那么请看此篇文章:完全物理机安装操作系统(安装有风险,请慎重!)1、最简单也最传统的安装安装方式就是使用光驱安装a、我们需要一张空白的CD以及一台DVD刻录机b、将下载后的转载 2015-03-11 17:42:26 · 3498 阅读 · 2 评论 -
Linux 线程浅析
进程和线程的区别与联系在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么, 只是维护应用程序所需的各种资源,而线程则是真正的执行实体。为了让进程完成一定的工作,进程必须至少包含一个线程。进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己的地址空间,有自己的堆,上级挂靠单位是操作系统。操作系统会以进程原创 2015-04-14 14:53:28 · 2998 阅读 · 1 评论 -
浅谈进程地址空间与虚拟存储空间
早期的内存分配机制在早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序都是直接运行在内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址。当计算机同时运行多个程序时,必须保证这些程序用到的内存总量要小于计算机实际物理内存的大小。那当程序同时运行多个程序时,操作系统是如何为这些程序分配内存 的呢?下面通过实例来说明当时的内存分配方法:某台计算机总的内存大小...转载 2015-04-17 19:35:47 · 13233 阅读 · 5 评论