![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
UNIX环境高级编程
文章平均质量分 79
比不了就不比
这个作者很懒,什么都没留下…
展开
-
IO模式设置,阻塞与非阻塞的比较
非阻塞IO 和阻塞IO: 在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明: 基本概念: 阻塞IO:: socket 的阻塞模式意味着必须要做完IO 操作(包括错误)才会转载 2014-09-18 16:10:45 · 943 阅读 · 0 评论 -
终端
一、终端要理解伪终端(Pseudo Terminal),先来看看什么是“终端”(Terminal)。终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。1、串行端口终端(/dev/ttySx)串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。这些串行端口所对应的设原创 2014-09-23 22:04:05 · 731 阅读 · 0 评论 -
Signal ()函数详细介绍 Linux函数
signal()函数理解在 这个头文件中。signal(参数1,参数2);参数1:我们要进行处理的信号。系统的信号我们可以再终端键入 kill -l查看(共64个)。其实这些信号时系统定义的宏。参数2:我们处理的方式(是系统默认还是忽略还是捕获)。一般有3中方式进行操作。(1)eg: signal(SIGINT ,SIG_ING );//SI转载 2014-09-13 15:19:08 · 1362 阅读 · 0 评论 -
信号的阻塞与未决
信号状态: 信号的”未决“是一种状态,指的是从信号的产生到信号被处理前的这一段时间;信号的”阻塞“是一个开关动作,指的是阻止信号被处理,但不是阻止信号产生。 APUE例题在sleep前用sigprocmask阻塞了退出信号,然后sleep,然后在sleep的过程中产生一个退出信号,但是此时退出信号被阻塞过,(中文的”阻塞”在这里容易被误解为一种状态,实际上是一种类似于开关的动原创 2014-09-14 08:42:10 · 589 阅读 · 0 评论 -
getopt函数用法
描述:getopt函数是用来解析命令行参数的, 以‘-’或‘--’开头的参数为选项元素,除去‘-’或‘--’的选项元素为选项字符。如果getopt函数被重复调用,则它将会依次返回每个选项元素中的选项字符。使用getopt函数需要包含以下头文件:#include #include 有几个全局变量与getopt函数解析参数有关:opt原创 2014-09-24 16:10:09 · 1082 阅读 · 0 评论 -
线程同步:条件变量的使用细节分析
如同互斥量和读写锁一样,条件变量也需要初始化和回收#includeint pthread_cond_init(pthread_cond_t *restrict cond,pthread_condattr_t *restrict attr);int pthread_cond_destroy(pthread_cond_t *cond);互斥量和读写锁解决了多线程访问共享变量转载 2014-09-15 22:12:26 · 423 阅读 · 0 评论 -
Posix多线程编程学习笔记(五)—条件变量(1)
一、什么是条件变量 与互斥锁不同,条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。通常条件变量和互斥锁同时使用。 条件变量使我们可以睡眠等待某种条件出现。条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。条 件的转载 2014-09-15 21:38:45 · 438 阅读 · 0 评论 -
进程和线程的区别
线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间; (2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源 (3)线程是处理器调度的基本单位,但进程不是. (4)二者均可并发执行. 线程、进程和程序的简单比较转载 2014-09-16 08:46:14 · 569 阅读 · 0 评论 -
sigwait()函数
线程可以通过原创 2014-09-16 17:10:42 · 3127 阅读 · 0 评论 -
dup和dup2
3.2. dup和dup2函数dup和dup2都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个file结构体。如果两个文件描述符指向同一个file结构体,File Status Flag和读写位置只保存一份在file结构体中,并且file结构体的引用计数是2。如果两次open同一文件得到两个文件描述符,则每个描述符对应一个不同的file结构体,可以有不同的File Stat原创 2014-09-16 21:55:49 · 872 阅读 · 0 评论 -
Linux中的文件描述符与打开文件之间的关系
1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。如果此时去打开一个新的文件转载 2014-09-16 22:12:24 · 704 阅读 · 0 评论 -
Linux 守护进程daemon
Daemon程序简介 Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法和前台的用户交互。Daemon程序一般都作为服务程序使用,等待客户端程序与它通信。我们也把运行的Daemon程序称作守护进程。 比如,我们的网络服务程序,可以在完成创建套接口,绑定套接口,设置套接口为监听模式后转载 2014-09-17 14:25:29 · 1852 阅读 · 0 评论 -
linux可重入、异步信号安全和线程安全
一 可重入函数原创 2014-09-25 10:41:45 · 3211 阅读 · 0 评论 -
Linux下C程序的存储空间布局
下面是对可执行文件aa运行size命令后得到的结果。 [root@xxx1 algriom]# size aa text data bss dec hex filename 1257 500 16 1773 6ed aa 其中: text:表示正文段大小,这是CPU执行的机器指令部分,通常转载 2014-09-25 11:02:21 · 651 阅读 · 0 评论 -
Linux 的启动流程
辅助环境:rh9,fc7另:本文如无特殊解释,init.d指的就是/etc/rc.d/init.d目录。本文包括3部分内容1、 Linux的引导过程2、 运行级别3、 /etc/rc.d/ 与/etc/rc.d/init.d的关系都仅限于自身的理解,如有差错和不足的地方请指正和补充!一起学习,一起进步。 “转载 2014-09-17 09:29:06 · 401 阅读 · 0 评论 -
阻塞和非阻塞read/write
read函数调用read函数从大原创 2014-09-17 16:13:26 · 29274 阅读 · 3 评论 -
Linux虚拟地址空间布局
在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中。这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4GB的内存地址块。在Linux系统中, 内核进程和用户进程所占的虚拟内存比例是1:3,而Windows系统为2:2(通过设置Large-Address-Aware Executables标志也可为1:3)。这并不意味着内核使用那么多物理内存,仅表转载 2014-09-25 11:00:14 · 733 阅读 · 0 评论 -
signal()函数
UNIX系统的信号机制原创 2014-09-14 22:42:12 · 2594 阅读 · 0 评论 -
setjmp和longjmp函数使用详解
非局部跳转语句---setjmp和longjmp函数。非局部指的是,这不是由普通C语言goto,语句在一个函数内实施的跳转,而是在栈上跳过若干调用帧,返回到当前函数调用路径上的某一个函数中。#include Int setjmp(jmp_buf env); 返回值:若直接调用则返回0,若从longjmp调用返回则返回非0值的longjmp中的val值Void long转载 2014-09-13 20:59:56 · 503 阅读 · 0 评论 -
signal(SIGCLD,SIG_IGN)
遇到信号量的问题? signal(SIGCLD,SIG_IGN)SIGCHLD的语义为:子进程状态改变后产生此信号,父进程需要调用一个wait函数以确定发生了什么。 对于SIGCLD的早期处理方式如下:如果进程特地设置该信号的配置为SIG_IGN,则调用进程的子进程将不产生僵死进程。 如果将SIGCLD的配置设置为捕捉,则内核立即检查是否有子进程准备好被等待,如果是转载 2014-09-13 18:31:30 · 21130 阅读 · 0 评论 -
交互式shell和非交互式shell、登录shell和非登录shell的区别
交互式shell和非交互式shell、登录shell和非登录shell的区别。首先,这是两个不同的维度来划分的,一个是是否交互式,另一个是是否登录。交互式shell和非交互式shell(interactive shell and non-interactive shell)交互式模式就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令。这种模式被称作交互式是因为she转载 2014-09-12 22:58:01 · 542 阅读 · 0 评论 -
自己实现popen函数
闲来无事,自己实现了popen函数mypopen,后来查看了popen函数的源码发现自己实现的与其相差无几,本函数与linux中的实现最大的不同是不需要用专门的pclose()函数来关闭文件指针,用普通的fclose()即可,linux实现的代码也会给出在下文,可以对比一下其中差异。 主要通过pipe管道实现,具体思路如下: 1、使用pipe()建立管道转载 2014-09-19 08:56:57 · 1291 阅读 · 0 评论 -
popen和pclose函数
标准I/O函数库提供了popen函数,它启动另外一个进程去执行一个shell命令行。这里我们称调用popen的进程为父进程,由popen启动的进程称为子进程。popen函数还创建一个管道用于父子进程间通信。父进程要么从管道读信息,要么向管道写信息,至于是读还是写取决于父进程调用popen时传递的参数。下在给出popen、pclose的定义:原创 2014-09-18 22:58:10 · 17278 阅读 · 1 评论 -
理清Linux中的各种用户ID关系
绿色代表进程(进程的性质)橙色代表文件(文件的性质)。当进程试图打开文件时,内核会进行如下权限测试:0. 若进程的有效用户ID是0(超级用户),则允许访问。1. 若进程的有效用户ID等于文件的所有者ID,那么进行文件所有者访问权限的测试(与open的参数对比),对应图中的1。2. 若进程的有效组ID或进程的附加组ID之一等于文件的组ID,则进行文件所属组的权限测试,对应图中转载 2014-09-11 11:37:52 · 537 阅读 · 0 评论 -
网络字节序与主机字节序的转换
在对IP地址结构体SOCKADDR_IN赋值的时候,经常会用到下列的函数htonl,htons,inet_addr,与之相对应的函数是ntohl,ntohs,inet_ntoa。查看这些函数的解析,会发现这些函数其实是与主机字节序和网络字节序之间转换有关。就是什么网络字节序,什么是主机字节序呢?下面我写出他们之间的转换:用IP地址127.0.0.1为例: 第一步 127原创 2014-09-20 08:50:03 · 3619 阅读 · 1 评论 -
I/O复用——poll(二)
poll函数[cpp] view plaincopy#include int poll(struct pollfd *fdarray,unsigned long nfds,int timeout); /***** 返回,准备好描述字的个数,0---超时,-1---出错******/ 第一个参数是指向一个结构数组第一个元素的指针原创 2014-09-20 12:34:38 · 440 阅读 · 0 评论 -
I/O复用:select和poll函数(一)
一、概述 我们看到上面的TCP客户同时处理两个输入:标准输入和TCP套接字。我们遇到的问题就是在客户阻塞于(标准输入上的)fgets调用期间,服务器进程会被杀死。服务器TCP虽然正确地给客户TCP发送一个FIN,但是既然客户进程阻塞于从标准输入读入的过程,它将看不到这个ROF,知道从套接字读时为止(可能已经过了很长时间)。这样的进程需要一种预先告知内核的能力,使得内核一原创 2014-09-20 12:22:23 · 584 阅读 · 0 评论 -
I/O复用——select(二)
select函数该函数允许进程指示内核等待多个事件中的任何一个发生,并仅在有一个或是多个事件发生或经历一段指定的时间后才唤醒它。我们调用select告知内核对哪些描述字(就读、写或异常条件)感兴趣以及等待多长时间。我们感兴趣的描述字不局限于套接口,任何描述字都可以使用select来测试。select函数原型:#includeselect.h>#includeint sele原创 2014-09-20 12:30:09 · 463 阅读 · 0 评论 -
getaddrinfo函数详解
函数原型: int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res); void freeaddrinfo(struct addrinfo *res); struct addrinfo转载 2014-09-20 10:35:11 · 1784 阅读 · 0 评论 -
setsockopt()函数用法
1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历转载 2014-09-21 19:45:49 · 582 阅读 · 0 评论 -
Linux进程管理——fork()和写时复制
写时复制技术最初产生于Unix系统,用于实现一种傻瓜式的进程创建:当发出fork( )系统调用时,内核原样复制父进程的整个地址空间并把复制的那一份分配给子进程。这种行为是非常耗时的,因为它需要: · 为子进程的页表分配页面· 为子进程的页分配页面· 初始化子进程的页表· 把父进程的页复制到子进程相应的页中 创建一个地址空间的这种转载 2014-09-09 20:17:20 · 5259 阅读 · 4 评论 -
fork与vfork的区别
fork()与vfock()都是创建一个进程,那他们有什么区别呢?总结有以下三点区别: 1. fork ():子进程拷贝父进程的数据段,代码段 vfork ( ):子进程与父进程共享数据段 2. fork ()父子进程的执行次序不确定 vfork 保证子进程先运行,在调用exec 或exit 之前与父进程数据是共享的,在它调用exec 或exit转载 2014-09-09 22:31:08 · 867 阅读 · 0 评论 -
值-结果参数(socket编程中的函数举例)
我们已经知道,当把套接口地址结构传递给套接口函数时,总是通过指针来传递的,即传递的是一个指向结构的指针。结构的长度也作为参数来传递,其传递方式取决于结构的传递方向:从进程到内核,还是从内核到进程。1、从进程到内核传递套接口地址结构有3个函数:bind、connect和sendto,这3个函数的一个参数是指向套接口地址结构的指针,另一个是结构的整数大小,例如:struct socka原创 2014-09-22 08:49:38 · 1338 阅读 · 1 评论 -
如何查看静态库内容 Unix/Linux
如何查看静态库内容 Unix/Linux以下从最好情况->最坏情况:1. 最好知道静态库的原文件(.c),要是知道声明文件(.h)也比较好。2. ar -t YourFile 看其结构,找其中的原文件。3. 可以将库文件下到本地用UE打开,然后你就找吧。另外,看动态库用 nm -D lib*.so 附:1.ar基本用法2.转载 2014-09-10 11:01:19 · 605 阅读 · 0 评论 -
linux 下设置用户ID 和 设置组ID 学习笔记
一: 一个进程相关的ID主要有: 实际用户ID 实际组ID : 标识空间我们是谁, 登录时取自口令文件登录项,登录会话期间一直不变,超级用户可改变 有效用户ID 有效组ID : 决定了我们的文件访问权限,也就是用来测试本进程对某些文件的访问权限 保存的设置用户ID,设置组ID: 执行一个程序时包含了有效用户ID 和有效组ID的副本ps: 通常 有效用户ID等于实际用户I转载 2014-09-10 21:15:01 · 1097 阅读 · 0 评论 -
关于unix下实际用户ID、有效用户ID、设置用户ID、文件所有者ID的一点理解
摘要:最近看APUE时为这几个ID困扰了很久,查找了很多资料后,终于感觉比较清晰了。先记在这里。或许还有些理解上的偏差,后续更正。本文主要讲述这几种ID的区别和联系。 实际用户ID:有的文章中将其称为真实用户ID,这个ID就是我们登陆unix系统时的身份ID。有效用户ID:定义了操作者的权限。有效用户ID是进程的属性,决定了该进程对文件的访问权限。 文件的访问权限包括读写和执行转载 2014-09-11 09:44:30 · 1405 阅读 · 0 评论 -
sysconf()、pathconf()和fpathconf()函数
对于运行时的限制值和选项,我们已经知道可以用sysconf()、pathconf()和fpathconf()三个函数之一来确定它们的值。具体地,sysconf()用于获得与文件或目录无关的限制值,以及系统特征选项;pathconf()和fpathconf()用于获得与文件或目录有关的限制值。这三个函数的原型为:#include long int sysconf(int parameter)原创 2014-09-22 15:21:23 · 4420 阅读 · 1 评论 -
问题1——在子进程中调用execl完后,接着调用_exit(0)的意义——< APUE-P201>
整个程序是这样的:if(pid == 0){execl("/bin/sh", "sh", "-c", cmdtring, (char*0))_exit(127);}首先,要搞清楚exec的执行是替换整个程序执行的。也就是将整个程序内容(包括数据、堆、栈空间,尤其是文本静态区),都会给替换掉的。所以如果execl成功,那么后面的程序转载 2014-09-11 20:51:39 · 1788 阅读 · 0 评论 -
使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符
我们经常会碰到需要fork子进程的情况,而且子进程很可能会继续exec新的程序。这就不得不提到子进程中无用文件描述符的问题!fork函数的使用本不是这里讨论的话题,但必须提一下的是:子进程以写时复制(COW,Copy-On-Write)方式获得父进程的数据空间、堆和栈副本,这其中也包括文件描述符。刚刚fork成功时,父子进程中相同的文件描述符指向系统文件表中的同一项(这也意味着转载 2014-12-21 21:41:14 · 1074 阅读 · 0 评论