Linux系统编程
懒人李冰
音视频编解码
展开
-
Linux环境编程之进程(五):竞争条件以及exec函数
(一)当多个进程企图对共享数据进行某种处理,而最后的结果又取决于进程运行的顺序时,就认为它们发生了竞争关系。避免竞争的条件,给出apue上的一个代码吧:#include "apue.h"static void charatatime(char *);intmain(void){ pid_t pid; TELL_WAIT(); /*set things up for TEL原创 2014-05-15 10:44:21 · 1407 阅读 · 0 评论 -
Linux环境编程之文件I/O(七):目录文件及操作
引言:在Linux中,目录也是文件,我们在使用linux系统时,一般使用mkdir命令创建新的目录,跟命令相对应的也有创建目录、删除目录的函数。(一)用mkdir函数创建目录,用rmdir函数删除目录。注意:当我们在创建普通文件时,一般指定文件的mode为读、写权限,但对于目录,我们至少要设置1个执行权限,以允许访问该目录中的文件名。用rmdir函数删除一个空目录。函数原型如下:原创 2014-05-12 23:30:23 · 1721 阅读 · 0 评论 -
Linux环境编程之进程(二):程序的存储空间布局
引言:一个写好的程序一般要存放在存储器中,那么程序中的代码、数据等各部分,是如何有规律的存放在存储器中的呢?(一)一个存储的程序可分为五部分:正文段、初始化数据段、非初始化数据段、栈、堆。其典型的存储安排如下图:正文段:这是由CPU执行的机器指令的部分。通常,正文段是可共享的,所以即使是频繁执行的程序在存储器中也只需要一个副本,另外正文段常常是只读的,以防止程序由于意外而修原创 2014-05-14 14:56:16 · 1341 阅读 · 0 评论 -
Linux环境编程之进程(一):main函数调用、进程终止以及命令行参数和环境表
(一)main函数调用main函数作为程序运行时的入口函数,它是如何被调用的呢?首先必须清楚一点,main函数也是一个函数,它只有被调用才能够执行。其实,在执行可执行程序时,在调用main函数之前,内核会先调用一个特殊的启动例程,将此启动例程作为可执行程序的起始地址。启动例程是如何作为可执行程序的起始地址的?这是由链接编译器设置的,而链接编译器则是由C编译器(如gcc编译器)调用的。启动例程作原创 2014-05-14 13:56:46 · 3925 阅读 · 0 评论 -
Linux环境编制之IPC进程间通信(一):IPC概述
进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。但是,系统空间却是“公共场所”,所以内核显然可以提供这样的条件。除此以外,那就是双方都可以访问的外设了。在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过“注册表”或其它数据库中的某些表项和记录交换信息。广义原创 2014-06-04 21:04:18 · 1244 阅读 · 0 评论 -
Linux环境编程之IPC进程间通信(四):管道和FIFO比较
系统加于管道和FIFO的唯一限制是:1、OPEN_MAX 一个进程在任意时刻打开的最大描述符数。2、PIP原创 2014-06-04 21:12:07 · 1227 阅读 · 0 评论 -
Linux环境编程之IPC进程间通信(五):Posix消息队列1
对于管道和FIFO来说,必须应该先有读取者存在,否则先有写入者是没有意义的。而消息队列则不同,它是一个消息链表,有足够写权限的线程可往别的队列中放置消息,有足够读权限的线程可从队列中取走消息。每个消息都是一个记录,它由发送者赋予一个优先级。在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达。消息队列是随内核的持续性,一个进程可以往某个队列写入一些消息,然后终止,再让另外原创 2014-06-05 09:46:08 · 1810 阅读 · 0 评论 -
Linux环境编程之IPC进程间通信(二):管道
管道作为最古老的进程间通信方法,它有以下几个特点:1、没有名字,因此原创 2014-06-04 21:07:00 · 1670 阅读 · 0 评论 -
Linux环境编程之同步(一):互斥锁
同步的内容在《UNP2》里把它看作了进程间通信,我觉得其实tongbuzhishi原创 2014-06-06 10:54:07 · 1236 阅读 · 0 评论 -
Linux环境编程之IPC进程间通信(三):FIFO
管道是没有名字的,因此它只能在有qinyuan原创 2014-06-04 21:09:53 · 2226 阅读 · 0 评论 -
Linux环境编程之同步(二):条件变量
互斥锁用于上锁,条件变量则用于等待。条件变量是类型为pthread_cond_t的变量。一般使用如下函数:#include int pthread_cond_wait(pthread_cond_t *cptr, pthread_mutex_t *mptr);int pthread_cond_signal(pthread_cond_t *cptr);每个条件变量总是有一个互斥锁与之关联。调用原创 2014-06-06 14:29:23 · 1270 阅读 · 0 评论 -
Linux环境编程之同步(三):读写锁
概述互斥锁把试图进入我们称之为临界区的所有其他线程都阻塞住。该临界区通常涉及对由这些线程共享一个或多个数据的访问或更新。读写锁在获取读写锁用于读某个数据和获取读写锁用于写直接作区别。读写锁的分配规则如下:1、只要没有线程持有某个给定的读写锁用于写,那么任意数目的线程可以持有该读写锁用于读。2、仅当没有线程持有某个给定的读写锁用于读或用于写时,才能分配该读写锁用于写。即只要没有线程在原创 2014-06-06 15:27:29 · 1448 阅读 · 1 评论 -
Linux环境编程之同步(四):Posix信号量
信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语。有三种类型:Posix有名信号量,使用Posix IPC名字标识;Posix基于内存的信号量,存放在共享内存区中;System V信号量,在内核中维护。这三种信号量都可用于进程间或线程间的同步。图1 由两个进程使用的一个二值信号量图2 由两个进程使用的一个Posix有名二值信号量图3 由一个原创 2014-06-07 10:53:42 · 1954 阅读 · 0 评论 -
Linux环境编程之共享内存区(一):共享内存区简介
共享内存区是可用IPC形式中最快的。一旦内存区映射到共享它的进程的地址空间,进程间数据的传递就不再涉及内核。然而往该共享内存区存放信息或从中取走信息的进程间通常需要某种形式的同步。不再涉及内核是指:进程不再通过执行任何进入内核的系统调用来彼此传递数据。内核必须建立允许各个进程共享该内存区的内存映射关系,然后一直管理内存区。默认情况下通过fork派生的子进程并不与其父进程共享内存区。mmap原创 2014-06-08 13:44:32 · 1463 阅读 · 0 评论 -
Linux环境编程之文件I/O(六):文件属性
引言:在Linux中使用ls -l filename命令查看filename的属性时,会列出文件的9种属性,例如:ls -l /etc/fstab -rw-r--r-- 1 root root 1102 2013-10-12 02:33 /etc/fstab从左到右分别是类型与权限、文件个数、该文件或目录的拥有者、所属的组、文件大小、创建时间、文件名以上这些文件属性的信息原创 2014-05-12 20:48:32 · 1585 阅读 · 0 评论 -
Linux环境编程之文件I/O(八):文件链接
引言:执行如下命令时,ls /usr/local/lib/libfreetype.so -l显示内容:lrwxrwxrwx 1 root root 20 2014-04-06 22:57 /usr/local/lib/libfreetype.so -> libfreetype.so.6.9.0表明这是一个链接文件,通过链接可以实现对一个文件从不同路径对它进行引用。对于文件的链接有硬链接原创 2014-05-13 13:34:54 · 1259 阅读 · 0 评论 -
Linux环境编程之进程(三):函数间跳转
引言:在编写程序时,经常在函数内部使用goto语句来跳转,从而进行出错处理,那么如果想要在函数之间进行跳转该怎么做呢?使用setjmp和longjmp函数。给出示例程序:#include #include #include static void f1(int, int, int, int);static void f2(void);static jmp_buf jmpbu原创 2014-05-14 15:46:16 · 1267 阅读 · 0 评论 -
Linux环境编程之进程(四):创建新进程、执行程序和进程终止
引言:对于每个进程,都有一个非负整数表示的唯一进程ID。虽然进程的ID是唯一的,但却是可重用的。系统中有一些专用的进程。如ID为0的进程通常是调度进程,也成交换进程或系统进程(它是内核进程)。进程ID为1通常是init进程,它是一个普通的用户进程。一些与进程ID有关的函数:#include pid_t getpid(void); //返回值:调用进程的进程IDpit_t get原创 2014-05-15 09:26:16 · 2073 阅读 · 0 评论 -
Linux环境编程之文件I/O(二):文件的打开与关闭
详细讲解文件I/O中的打开、关闭、创建等函数原创 2014-05-10 16:11:04 · 2765 阅读 · 0 评论 -
Linux环境编程之文件I/O(三):文件的读写
对文件I/O中的read、write、lseek函数详细分析,并给出示例及应用原创 2014-05-10 22:17:22 · 1961 阅读 · 0 评论 -
Linux环境编程之文件I/O(一):文件描述符
详解讲解文件描述符原创 2014-05-10 15:05:40 · 1410 阅读 · 0 评论 -
Linux环境编程之进程(六):进程组
进程组每个进程除了有一个进程ID之外,还属于一个进程组。进程组是一个或多个进程的集合。每个进程组有一个唯一的进程组ID。进程组ID类似于进程ID——它是一个整数,并可存放在pid_t数据类型中。函数getpgrp返回调用进程的进程组ID。每个进程组都可以有一个组长进程。组长进程的标识是,其进程组ID等于其进程ID。组长进程可以创建一个进程组,创建该组中的进程,然后终止。只要在某个进程组中有原创 2014-05-15 15:00:08 · 1147 阅读 · 0 评论 -
Linux环境编程之进程(七):守护进程
守护进程也是一种进程,它由如下特性:1、生存期较长,在系统自举时启动,仅在系统关闭时终止。2、没有控制终端,在后台运行。系统中有很多守护进程,它们执行日常事务活动。如日志进程syslogd、web服务器httpd、邮件服务器sendmail和数据块服务器mysqld等。大多数守护进程都是以超级用户(用户ID为0)特权运行。没有一个守护进程具有控制终端,其终端设置为问号(?),终端前台进原创 2014-05-17 07:45:45 · 1447 阅读 · 0 评论 -
Linux环境编程之文件I/O(五):fcntl函数
引言:对于一个普通的文件,我们可以想到的对它的操作有,读取文件的内容、写数据到文件中,这些都是前面提到的read、write函数的作用。除此之外,还可以获取文件的其他性质,并对这些性质进行修改,比如文件的描述符、文件描述符标记、文件状态标志等等。这些对文件性质的修改就由fcntl函数完成。函数介绍: #include #include原创 2014-05-11 15:48:52 · 1293 阅读 · 0 评论 -
Linux环境编程之文件I/O(四):文件I/O的数据结构
(一)Linux系统支持不同进程间共享打开的文件。原创 2014-05-11 11:37:47 · 1393 阅读 · 0 评论 -
Linux环境编程之高级I/O(一):非阻塞I/O、记录锁
引言:高级I/O包括非阻塞I/O、记录锁、系统V流机制、I/O多路转接(select和poll函数)、readv和writev函数以及存储映射I/O。(一)非阻塞I/O可能会使进程永远阻塞的一类系统调用有:1、如果某些文件类型的数据并不存在,则读操作可能会使调用者永远阻塞。2、如果数据不能立即被上述同样类型的文件接受,则写操作也会使调用者永远阻塞。3、在某种条件发生之前,打开某原创 2014-05-18 14:00:06 · 1701 阅读 · 0 评论 -
Linux环境编程之信号(二):不可靠信号、中断的系统调用、可重入函数
(一)不可靠信号对前面说的信号,是不可靠的,不可靠指的是信号可能会丢失:一个信号发生了,但进程却可能一直不知道这一点。另外,进程对信号的控制能力有限,只能捕捉信号或忽略它。有时用户希望通知内核阻塞一个信号:不要忽略它,在其发生时记住它,然后在进程做好准备时再通知它。这种阻塞信号的能力并不具备。之前的版本中村咋一个问题:在进程每次接到信号对其进行处理时,随即将该信号动作复位为默认值。另一个问原创 2014-05-17 20:10:33 · 1599 阅读 · 0 评论 -
Linux环境编程之信号(三):一些信号函数
(一)kill和raise函数kill函数将信号发送给进程或进程组。raise函数则允许进程自身发送信号。 #include #include int kill(pid_t pid, int sig); int raise(int signo); //返回值:若成功则返回0,若出错则返回-1。参数:pid参数有4种原创 2014-05-17 21:58:36 · 978 阅读 · 0 评论 -
Linux环境编程之信号(一):信号基本概述
引言假如在后台运行一个可执行程序./a.out,如果想终止该程序,通常会按下Ctrl-C,从而产生一个中断,其实这个过程的实现就是通过信号完成的。信号是软件中断,它提供了一种处理异步事件的方法。(一)每个信号都有一个名字,这些名字都以三个字符SIG开头。例如SIGALARM是闹钟信号,当由alarm函数设置的计时器超时后产生此信号。Linux除支持31种不同信号外,还支持应用程序额外定原创 2014-05-17 13:17:06 · 1176 阅读 · 0 评论 -
Linux环境编程之共享内存区(二):Posix共享内存区
现在将共享内存区的概念扩展到将无亲缘关系进程间共享的内存区包括在内。Posix提供了两种在无亲缘关系进程间共享内存区的方法:1、内存映射文件:由open函数打开,由mmap函数把得到的描述符映射到当前进程地址空间中的一个文件。(上一节就是这种技术)2、共享内存区对象:由shm_open打开一个Posix名字(也许是在文件系统中的一个路径名),所返回的描述符由mmap函数映射到当前进程的地址原创 2014-06-08 15:49:59 · 1248 阅读 · 0 评论