UNIX环境编程
文章平均质量分 77
I_love_blog
这个作者很懒,什么都没留下…
展开
-
线程和进程、程序、应用程序之间的关系
看到一种说法是“一个程序至少有一个进程,一个进程至少有一个线程”,这种把程序与进程,进程与线程的关系混淆的说法是错误的。程序(program)只能有一个进程,一个进程就是一个程序。有人说,我打开一个程序,比如chrome,有十多个进程呢,这是咋回事。那就是十多个程序,操作系统给他们分配了彼此独立的内存,相互执行不受彼此约束,分配同样时间的CPU。对于用户而言,他们是一个整体,我们通常称之为应用原创 2017-04-08 10:37:39 · 477 阅读 · 0 评论 -
《APUE》读书笔记—第十三章守护进程
守护进程也称为精灵进程是一种生存期较长的一种进程。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。他们常常在系统引导装入时启动,在系统关闭时终止。unix系统有很多守护进程,大多数服务器都是用守护进程实现的,例如inetd守护进程。1、守护进程的特征用ps命令察看一些常用的系统守护进程,看一下他们和几个概念:进程组、控制终端和会话有什么联系。执行: ps –ax原创 2017-04-24 14:40:45 · 258 阅读 · 0 评论 -
unix中的sleep函数实例
在unix环境编程中,经常用到定时,通常用到sleep函数让程序进行定时,但是该函数是可以被信号进行中断的,也就是说,当用户键入中断时,从中断中返回,则程序从sleep函数的下一条语句进行执行。代码:#include #include #include #include void sig_handler(int num){ printf("\nrecevive t原创 2017-05-16 20:49:21 · 3779 阅读 · 0 评论 -
《APUE》读书笔记-第十四章高级I/O
1、非阻塞I/O对低速设备的I/O操作可能会使进程永久阻塞,这类系统调用主要有如下情况:(1)如果数据并不存在,则读文件可能会使调用者永远阻塞(例如读管道、终端设备和网络设备)。(2)如果数据不能立即被接受,则写这些同样的文件也会使调用者永远阻塞;(3)在某些条件发生之前,打开文件会被阻塞(例如以只写方式打开一个FIFO,那么在没有其他进程已用读方式打开该FIFO时);(4原创 2017-04-25 21:58:12 · 351 阅读 · 0 评论 -
多线程并行与退出
例1:进程与线程并行输出#include #include #include #include //线程函数入口void *thread_routine(void *arg){ printf("I am a thread, my thread id is : %d\n", pthread_self()); int i; for ( i = 0; i <原创 2017-05-17 23:46:17 · 417 阅读 · 0 评论 -
linux多线程互斥锁的简单使用
过程:首先定义一个互斥锁变量;然后初始化该互斥锁pthread_mutex_init;使用临界区资源的时候首先获取该锁pthread_mutex_lock(如果无法获取资源则线程会阻塞,直到该资源可以使用),对临界区资源使用完时候释放该互斥锁pthread_mutex_unlock;实例1:不使用互斥锁,多个线程输出,此时的效果是多个线程是并行输出的,没有对资源原创 2017-05-22 20:58:23 · 533 阅读 · 2 评论 -
网络编程中常见的头文件
sys/types.h:数据类型定义 2 3 sys/socket.h:提供socket函数及数据结构 4 5 netinet/in.h:定义数据结构sockaddr_in 6 7 arpa/inet.h:提供IP地址转换函数 8 9 netdb.h:提供设置及获取域名的函数10 11 sys/ioctl.h:提供对I/O控制的函数12 13 sys/p原创 2017-06-02 23:45:59 · 572 阅读 · 0 评论 -
makefile 中 $@ $^ %< 使用
这篇文章介绍在LINUX下进行C语言编程所需要的基础知识。在这篇文章当中,我们将会学到以下内容:源程序编译Makefile的编写程序库的链接程序的调试头文件和系统求助1.源程序的编译在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器。 下面我们以一个实例来说明如何使用gcc编译器。假设我们有下面一个非转载 2017-07-27 09:34:03 · 522 阅读 · 0 评论 -
用信号量解决哲学家就餐问题
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define ERR_EXIT(m)\ do\ {\ perror(m);\ exit(原创 2017-10-28 19:12:27 · 3901 阅读 · 0 评论 -
select、poll、epoll之间的区别总结[整理]
select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用原创 2017-12-01 21:33:11 · 232 阅读 · 0 评论 -
多线程编程学习::POSIX 多线程基础(一)
基础概念线程进程里执行代码的部分;包含一系列机器指令所必须的机器状态,包括当前指令位置(一般为PC寄存器)、栈顶指针SP、通用寄存器、地址和数据寄存器等线程不包括进程中的其他数据,如地址空间和文件描述符进程线程加上地址空间、文件描述符和其他数据一个进程中的所有线程共享文件和地址空间,包括程序段、数据段和堆栈进程 vs 线程多个线程可以共享一个地址原创 2017-12-03 14:51:28 · 273 阅读 · 0 评论 -
多线程编程学习::POSIX 多线程基础(二)
线程建立与使用创建线程通过 pthread_create() 函数创建线程向该函数传递线程函数地址和线程函数参数线程函数只有一个 void* 参数该函数返回 pthread_t 类型的线程ID一般调用该函数创建线程,然后调用 pthread_join() 函数等待线程结束在当前线程从函数 pthread_create() 中返回以及新线程被调度执行之间不存在同步原创 2017-12-03 14:53:19 · 219 阅读 · 0 评论 -
线程安全与可重入
定义 线程安全:被多个并发的线程反复调用时,他会产生正确的结果。 可重入:当被多个线程调用的时候,不会引用任何共享数据。 Remark:任何线程不安全问题的根源都是“共享数据”。所以,不使用任何共享数据的函数(即:可重入函数)肯定是线程安全的。但这并不等于说,线程安全函数就是可重入函数。为什么呢?因为:即使有线程有共享数据,线程被并发调用的时候产生的结果可以是正确的。原创 2017-12-03 15:28:51 · 212 阅读 · 0 评论 -
多线程编程学习::POSIX 多线程基础(三)
注:本文涉及到的 glibc 版本为 2.11,若无特别说明,.表示 glibc-2.11 源代码目录,本文为 /usr/src/glibc-2.11。基本概念临界区:一个存取共享资源的代码段,而这些共享资源无法同时被多个线程访问;即影响共享数据的代码段。线程同步方法确保对相同/相关数据的内存访问互斥地进行,即一次只能允许一个线程写数据,其他线程必须等待Pthrea原创 2017-12-03 16:58:48 · 337 阅读 · 0 评论 -
HTTP 协议中 URI 和 URL 区别
统一资源标志符URI就是在某一规则下能把一个资源独一无二地标识出来。拿人做例子,假设这个世界上所有人的名字都不能重复,那么名字就是URI的一个实例,通过名字这个字符串就可以标识出唯一的一个人。现实当中名字当然是会重复的,所以身份证号才是URI,通过身份证号能让我们能且仅能确定一个人。那统一资源定位符URL是什么呢。也拿人做例子然后跟HTTP的URL做类比,就可以有:动物住址协议:/原创 2017-12-12 21:37:18 · 337 阅读 · 0 评论 -
linux信号阻塞与未决
执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞(Block)某个信号。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。注意,阻塞和忽略是不同,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。信号在内核中的表示可以看作是这样的:原创 2017-05-24 19:42:52 · 401 阅读 · 0 评论 -
多线程函数实例解析
创建线程,并可以向创建的线程传递一个参数#include int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg) 等待线程终止,并且可以获得线程的返回值;#include int pthread_jo原创 2017-05-24 10:51:00 · 477 阅读 · 0 评论 -
《APUE》读书笔记-第三章文件I/O
Unix系统中大多数文件I/O只需用到五个函数:open,read,write,lseek,(移动指针读写位置),close。本章说介绍的I/O是不带缓冲的,即:每个read和write都调用内核中的一个系统调用。不是ISO C的组成部分。对于内核而言,所有打开的文件都通过文件描述符引用。在中定义三个标准的文件描述符:STDIN_FILENO 标准输入STDOUT_FILENO原创 2017-04-12 10:43:38 · 270 阅读 · 0 评论 -
《APUE》读书笔记—第四章文件和目录
第四章主要介绍的是文件结构及目录。重点是通过stat函数获取文件的结构信息,然后是文件目录及其遍历。学完本章后,编写了一个输出给的目录下的文件信息的程序。首先是包含在文件下的stat,fstat,lstat三个函数,三个函数的原型如下:int stat(const char *path, struct stat *buf);int fstat(int fd, struct stat *原创 2017-04-12 10:50:47 · 343 阅读 · 0 评论 -
《APUE》读书笔记—第九章进程关系
本章看后给人似懂非懂的感觉,主要是不知道实际当中如何去使用。通过前面几章的学习,每个进程都有一个父进程,当子进程终止时,父进程得到通知并取得子进程的退出状态。先将本章基本的知识点总结如下,日后再看时候好好总结一下。1、终端登录 介绍了有终端登录Unix系统的过程。通过init进程读文件/etc/ttys,fork一个子进程调用exec执行getty程序进行登录,当用户输入完用户名原创 2017-04-18 11:34:12 · 342 阅读 · 0 评论 -
《APUE》读书笔记—第十章信号(上)
信号时软中断,很多比较重要的应用程序都需要处理信号,信号提供了一种处理异步事件的方法。每个信号都一个名字,以SIG开头,在头文件中定义信号类型,都是正整数(信号编号)。 产生信号的条件:(1)当用户按某些终端键时,引发终端产生的信号。(2)硬件异常产生信号。(3)进程调用kill函数将信号发送给另外一个进程或进程组。(4)用户用kill命令将信号发送给其他原创 2017-04-18 11:44:56 · 269 阅读 · 0 评论 -
《APUE》读书笔记-第十五章进程间通信
进程间通信(IPC)是指能在两个进程间进行数据交换的机制。现代OS都对进程有保护机制,因此两个进程不能直接交换数据,必须通过一定机制来完成。 IPC的机制的作用: (1)一个软件也能更容易跟第三方软件或内核进行配合的集成,或移植.如管道,在shell 下执行 ps –aux | grep bash。 (2)简化软件结构, 可以把一个软件划分多个进程或线程,通过IPC,集成在一起工原创 2017-04-28 16:29:09 · 289 阅读 · 0 评论 -
管道和FIFO
1.管道(pipe) 管道在Unix及Linux进程间通信是最基础的,很容易理解。管道就像一个自来水管,一端注入水,一端放出水,水只能在一个方向上流动,而不能双向流动。管道是典型的单向通信,即计算机网络所说的“半双工”。管道又名匿名管道,所以只能用在具有公共祖先的进程之间使用,通常使用在父子进程之间通信。通常是父进程创建一个管道,然后fork一个子进程,此后父子进程共享这个管道进行通信。原创 2017-04-13 22:31:04 · 274 阅读 · 0 评论 -
《APUE》读书笔记-第十六章网络IPC:套接字
通过网络套接字可以使得不同计算机上运行的进程相互通信。1、创建套接字#include Int socket( int domain, int type, int protocol);注意:AF_LOCAL域是AF_UNIX的别名,AF_UNSPEC域可以代表任何域。2、套接字通信是双向的,禁止套接字上的输入/输出#include Int sh原创 2017-04-29 14:42:59 · 398 阅读 · 0 评论 -
《APUE》读书笔记-第十七章高级进程间通信
本章主要介绍了基于STREAM的管道和UNIX域套接字,这些IPC可以在进程间传送打开文件描述符。服务进程可以使用它们的打开文件描述符与指定的名字相关联,客户进程可以使用这些名字与服务器进程通信。1、基于STREAMS的管道 STREAMS pipe是一个双向(全双工)管道,单个STREAMS管道就能向父、子进程提供双向的数据流。如下图所示:1.2命名的S原创 2017-04-30 16:16:11 · 328 阅读 · 0 评论 -
《APUE》读书笔记—第十一章线程
一个进程在同一时刻只能做一件事情,线程可以把程序设计成在同一时刻能够做多件事情,每个线程处理各自独立的任务。线程包括了表示进程内执行环境必需的信息,包括进程中标识线程的线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno变量以及线程似有数据。进程的所有信息对该进程的所有线程都是共享的,包括可执行的程序文本、程序的全局内存、栈及文件描述符。 使用线程的好处:(1)为每种事件原创 2017-04-19 10:19:04 · 361 阅读 · 0 评论 -
《APUE》读书笔记—第六章数据系统文件和信息
本章主要介绍了Unix系统的正常运行要使用的与系统有关的数据文件和信息。如:口令文件,阴影文件,组文件,附加组,系统标识,时间和日期历程。口令文件,即Unix系统用户数据库,存储在/etc/passwd中,是一个ASCll文件,包含的字段信息在定义的passwd数据结构中。struct passwd { char *pw_name; /* username */原创 2017-04-14 21:11:36 · 359 阅读 · 0 评论 -
《APUE》读书笔记—第七章进程环境
本章主要介绍了Unix进程环境,包含main函数是如何被调用的,命令行参数如何传递,存储方式布局,分配存储空间,环境变量,进程终止方法,全局跳转longjmp和setjmp函数及进程的资源限制。 main函数的原型为int main(int argc,char *argv[]);其中argc是命令行参数的数目,argv是指向参数的各个指针构成的数组。当内核执行C程序时,使用一个exec函原创 2017-04-15 16:54:30 · 246 阅读 · 0 评论 -
《APUE》读书笔记—第八章进程控制
本章介绍Unix的进程控制,包括进程创建,执行程序和进程终止,进程的属性,exec函数系列,system函数,进程会计机制。1、进程标识符 每一个进程都有一个非负整数标识的唯一进程ID。ID为0表示调度进程,即交换进程,是内核的一部分,也称为系统进程,不执行任何磁盘操作。ID为1的进程为init进程,init进程不会终止,他是一个普通的用户进程,需要超级用户特权运行。获取标识符函原创 2017-04-16 15:17:57 · 258 阅读 · 0 评论 -
《APUE》读书笔记-第十八章终端I/O
终端I/O应用很广泛,用于终端、计算机之间的直接连线、调制解调器以及打印机等等。终端I/O有两种不同的工作模式: (1)规范模式输入处理:终端输入以行为单位进行处理,对于每个读要求,终端驱动程序最多返回一行。(默认模式) (2)非规范模式输入处理:输入字符并不组成行。 终端设备是由一般位于内核的终端驱动程序控制的,每个终端设备有一个输入队列和一个输出队列。如下图:原创 2017-05-03 10:45:28 · 369 阅读 · 0 评论 -
《APUE》读书笔记-第十九章伪终端
1、综述 伪终端对于一个应用程序而言,看上去像一个终端,但事实上伪终端并不是一个真正的终端。从内核角度看,伪终端看起来像一个双向管道,而事实上Solaris的伪终端就是用STREAMS构建的。伪终端总是成对地使用的,就好像是个管道的两端。一端的设备称为"主设备"(master),另一端的设备称为"从设备"(slave),每一对伪终端设备,例如/dev/ptys0和/dev/ttys0,就原创 2017-05-03 11:01:49 · 347 阅读 · 0 评论 -
《APUE》读书笔记-第二十章数据库函数库
本章的内容是开发一个简单的、多用户数据库的C函数库。调用此函数库提供的C语言函数,其他程序可以读取和存储数据库中的记录。绝大部分商用数据库函数库提供多进程同时更新数据库所需要的并发控制,采用建议记录锁、B+树、动态散列实现数据库。1、函数库 开发类似ndbm函数库,增加了并发控制机制,从而允许多进程同时更新同一数据库。函数接口如下:#include "apue_db.原创 2017-05-03 11:07:19 · 735 阅读 · 0 评论 -
互斥锁和条件变量使用实例
条件变量简介:条件变量是线程中的东西,就是等待某一条件的发生,和信号一样。用法条件变量使我们可以睡眠等待某种条件出现。条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。条件变量类型为 pthread_cond_t。原创 2017-05-22 22:12:57 · 4049 阅读 · 4 评论 -
IO多路复用之select、poll、epoll详解
目前支持I/O多路复用的系统调用有 select,pselect,poll,epoll,I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,pselect,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己...原创 2017-10-18 18:51:08 · 315 阅读 · 0 评论