《UNIX环境高级编程》
文章平均质量分 77
个人最近在学习《UNIX环境高级编程》,发现其内容很好且有一定的难度,在学习的同时记录在此,在自己学习的同时及时分享自己的学习经验
BruceZhang
计算机专业的一个小学生
展开
-
使用system函数时应该忽略两个信号
在8.13节,我们展示了一个system函数的实现。然而,那个版本没有处理信号。POSIX.1要求system忽略SIGINT和SIGQUIT并阻塞SIGCHLD。在展示正确处理这些信号的版本之前,我们看下为什么需要担心这些信号的处理。下 面的代码使用了8.13节的system版本来调用ed编辑器。(这个编辑器作为UNIX系统的一部分已经有很长时间了。我们在这里原创 2013-05-11 16:48:34 · 5009 阅读 · 1 评论 -
信号实现父子进程之间的同步--sigsuspend的作用
函数原型: #include int sigsuspend(const sigset_t *mask);作用: 用于在接收到某个信号之前,临时用mask替换进程的信号掩码,并暂停进程执行,直到收到信号为止。 The sigsuspend() function replaces the current signal mask of the原创 2013-05-11 14:00:17 · 6642 阅读 · 1 评论 -
进程控制
程控制的主要任务是对系统中所有进程从产生、存在到消亡的全过程实行有效的管理和控制。进程控制一般是由操作系统的内核来实现,内核在执行操作时,往往是通过执行各种原语操作来实现的,以下介绍进程的各种控制。进程图 有向树 程图是一棵有向树(如左图),结点代表进程,原创 2013-05-04 13:36:17 · 2236 阅读 · 0 评论 -
调用 fork() 两次以避免僵死进程
当我们只fork()一次后,存在父进程和子进程。这时有两种方法来避免产生僵尸进程:父进程调用waitpid()等函数来接收子进程退出状态。父进程先结束,子进程则自动托管到Init进程(pid = 1)。 目前先考虑子进程先于父进程结束的情况: 若父进程未处理子进程退出状态,在父进程退出前,子进程一直处于僵尸进程状态。若父进程调用waitpid()(这里使用原创 2013-05-04 12:33:20 · 6626 阅读 · 0 评论 -
Linux C 实现文件传输
file_server.c 文件传输顺序服务器示例//////////////////////////////////////////////////////////////////////////////////////// file_server.c 文件传输顺序服务器示例///////////////////////////////////////////////////////原创 2013-05-03 14:38:32 · 3995 阅读 · 1 评论 -
Linux下互斥量与条件变量详细解析
1. 首先pthread_cond_wait 的定义是这样的The pthread_cond_wait() and pthread_cond_timedwait() functions are used to block on a condition variable. They are called with mutex locked by the calling thread or原创 2013-05-03 09:17:51 · 5557 阅读 · 1 评论 -
Linux C 实现生产者消费者问题
//信号量---线程间通信//“生产者消费者” 问题#include#include#include#include#include#define msleep(x) usleep(x*1000)#define PRODUCT_SPEED 3 //生产速度#define CONSUM_SPEED 1原创 2013-05-02 18:54:15 · 6496 阅读 · 1 评论 -
用C语言得到Linux主机的IP地址
#include ;#include ;#include ;#include ;#include ;#include ;#include ;#include ;#include ;#define ETH_NAME "eth0"int main(){ int sock; struct sockaddr_in sin;原创 2013-05-02 18:06:58 · 2796 阅读 · 0 评论 -
Linux多线程编程
#include #include #include #include #define MAX 10pthread_t thread[2];pthread_mutex_t mut;int number=0, i;void *thread1(){ printf ("thread1 : I'm thread 1\n"); for (i = 0; i <原创 2013-05-02 11:05:33 · 2666 阅读 · 0 评论 -
Linux下基于socket多线程并发通信的实现
pthread_server.c/*************************************************** * 文件名:pthread_server.c * 文件描述:创建子线程来接收客户端的数据 ***************************************************/ #include #include原创 2013-05-01 18:04:08 · 9906 阅读 · 4 评论 -
进程间通信--UDP
Server.c#include #include #include #include #include int main(void) { //create socket int fd = socket(AF_INET, SOCK_DGRAM, 0); if(fd==-1) { perr原创 2013-05-01 16:06:13 · 4101 阅读 · 0 评论 -
进程间通信--TCP
Client.c#include #include #include #include #include #include #include int main() { int sockfd; int len; struct sockaddr_in address; int result;原创 2013-05-01 16:01:20 · 2867 阅读 · 0 评论 -
进程间关系
Linux的进程相互之间有一定的关系。比如说,在Linux进程基础中,我们看到,每个进程都有父进程,而所有的进程以init进程为根,形成一个树状结构。我们在这里讲解进程组和会话,以便以更加丰富的方式了管理进程。 1. 进程组 (process group)每个进程都会属于一个进程组(process group),每个进程组中可以包含多个进程。进程组会有一个进程组领导进程 (原创 2013-04-29 12:39:59 · 2320 阅读 · 0 评论 -
Linux终端设备详解
终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。tty是Teletype的缩写。Teletype是最早出现的一种终端设备,很象电传打字机(或者说就是),是由Teletype公司生产的。在Linux系统的设备特殊文件目录/dev/下,终端特殊设备文件一般有以下几种:1.串行端口终端(/dev/ttySn)串行端口终端(Serial Port Term原创 2013-04-27 14:28:15 · 2380 阅读 · 0 评论 -
linux 开机自启动设置 inittab 详解
linux下的/etc/inittab中的英文解释: This file describes how the INIT process should set up the system in a certain run-level.The inittab file describes which processes are started at bootup an原创 2013-04-25 16:59:01 · 3530 阅读 · 0 评论 -
Socket编程获取服务器时间
客户端向服务器端发送请求,服务器收到请求做相应的处理,将处理结果传回客户端。下面采用TCP协议实现服务器和客户端之间的连接。1. 客户端约定双方的传输协议(UDP或者TCP),根据传输协议创建socket;服务器的IP地址和端口号;连接服务器;获取服务器传递回来的数据。#include #include #include #include原创 2013-04-25 10:55:20 · 4644 阅读 · 0 评论 -
带外数据
定义带 外 数据 想 像一下在银行人们排起队等待处理他们的帐单。在这个队伍中每个人最后都会移到前面由出纳员进行服务。现在想像一下一个走入银行,越过整个队伍,然后用枪抵 住出纳员。这个就可以看作为带 外 数据 。这个强盗越过整个队伍,是因为这把枪给了他凌驾于众人的权力。出纳员也会集中注意力于这个强盗身上,因为他知道当前 的形势是很紧急的。相应的,一个连接的流式套接口上的带 外 数转载 2013-04-24 14:51:12 · 2894 阅读 · 0 评论 -
《UNIX环境编程》第十六章--网络IPC:套接字
Contents套接字接口套接字描述符寻址字节序地址格式地址查询绑定地址建立连接数据传输套接字选项带外数据UNIX域套接字使用套接字的示例面向连接的ruptime无连接的ruptime套接字接口套接字接口是一组用来结合UNIX I/O函数进行进程间通信的函数,大多数系统上都实现了它,包括各种UNIX变种、Windows和Mac系统。套接字接口原创 2013-04-24 14:33:59 · 3315 阅读 · 1 评论 -
套接字选项
================================================ 套接字机制提供了两个套接字选项接口来控制套接字的行为。一个接口用来设置选项,另外一个接口用来允许我们请求选项的状态。我们可以获得以及设置三种类型的选项。 1.通用选项,可以工作在所有的套接字类型。 2.在套接字层次上面进行管理的选项,但是依赖底部协议的支持。 3.和每个协议相关的协议选原创 2013-04-24 11:08:38 · 3379 阅读 · 0 评论 -
Socket通信原理和实践
我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的。本文的主要内容如下:1、网络中进程之间如何通信?2、Socket是什么?转载 2013-02-10 01:28:08 · 105308 阅读 · 46 评论 -
struct sockaddr与struct sockaddr_in ,struct sockaddr_un的区别和联系
在linux环境下,结构体struct sockaddr在/usr/include/linux/socket.h中定义,具体如下:typedef unsigned short sa_family_t;struct sockaddr { sa_family_t sa_family; /* address family, AF_xxx */原创 2013-04-23 23:19:32 · 4268 阅读 · 0 评论 -
socket编程之addrinfo结构体与getaddrinfo函数
1. 概述IPv4中使用gethostbyname()函数完成主机名到地址解析,这个函数仅仅支持IPv4,且不允许调用者指定所需地址类型的任何信息,返回的结构只包含了用于存储IPv4地址的空间。IPv6中引入了getaddrinfo()的新API,它是协议无关的,既可用于IPv4也可用于IPv6。getaddrinfo函数能够处理名字到地址以及服务到端口这两种转换,返回的是一个addr原创 2013-04-23 23:05:32 · 8921 阅读 · 1 评论 -
Linux中的popen-pclose
popenLinux C 进程I/O函数,与pclose函数一起使用。表头文件 #include stdio.h>函数定义 FILE * popen ( const char * command , const char * type ); int pclose ( FILE * stream );函数说明 popen() 函数通过创建原创 2013-04-23 16:13:11 · 9903 阅读 · 0 评论 -
手把手教你把Vim改装成一个IDE编程环境(图文)
原文出自:http://blog.csdn.net/wooin/article/details/18589171写在前面Linux下编程一直被诟病的一点是: 没有一个好用的IDE, 但是听说Linux牛人, 黑客之类的也都不用IDE. 但是对我等从Windows平台转移过来的Coder来说, 一个好用的IDE是何等的重要啊, 估计很多人就是卡原创 2013-04-23 09:15:48 · 3817 阅读 · 1 评论 -
ubuntu c/c++ IDE编程环境
前言 不断有网友将编译器 GCC 误认为 IDE(集成开发环境) 期望脱离命令行 期望能在菜单中发现其身影 期望其能有一个集编辑编译链接调试运行于一体的界面故本文给大家简单罗列一些 C/C++ 编程中可用的 IDE,或许你从中可以找一个你喜欢的。为避免以下某个软件安装时不自动安装 build-essential 不妨先执行: su原创 2013-04-23 09:14:43 · 4294 阅读 · 2 评论 -
C语言中的typedef
typedef声明,简称 typedef,为现有类型创建一个新的名字。比如人们常常使用 t ypedef来编写更美观和可读的代码。所谓美观,意指typedef能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。 typedef使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。类型出现在所声明的变量名字中,位于 ''typedef''关键字右边原创 2013-04-22 15:19:44 · 1950 阅读 · 0 评论 -
链表
/*链表*/ #include #include #include #define LIST_SUCCESS 0 #define LIST_ERROR -1 typedef struct student { char name[20]; int chinese;//语文成绩 int math;原创 2013-04-22 14:32:04 · 1418 阅读 · 0 评论 -
Linux下的多进程间共享资源的互斥访问
#include #include #include #include #include #include pthread_mutex_t* g_mutex; //创建共享的mutex void init_mutex(void) { int ret; //g_mutex一定要是进程间可以共享原创 2013-04-22 14:30:30 · 7214 阅读 · 1 评论 -
一个简单的线程池
//threadpool.h #ifndef __THREADPOOL_H__ #define __THREADPOOL_H__ #include typedef void* (*task_fun)(void*); //用链表来维护等待任务 typedef struct threadtask { //任务的执行函数 tas原创 2013-04-22 14:28:01 · 2580 阅读 · 1 评论 -
线程同步----递归锁
概述最常见的进程/线程的同步方法有互斥锁(或称互斥量Mutex),读写锁(rdlock),条件变量(cond),信号量(Semophore)等。在Windows系统中,临界区(Critical Section)和事件对象(Event)也是常用的同步方法。 简单的说,互斥锁保护了一个临界区,在这个临界区中,一次最多只能进入一个线程。如果有多个进程在同一个临界区内活动,就有可能产生竞态条件原创 2013-04-22 14:26:22 · 3683 阅读 · 0 评论 -
POSIX多线程编程-条件变量pthread_cond_t
条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其它的某个线程改变了条件变量,它将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试条件是否满足。一般说来,条件变量被用来进行线承间的同步。 1.条件变量原创 2013-04-21 13:22:48 · 2304 阅读 · 0 评论 -
Linux线程介绍
1、进程与线程2、使用线程的理由3、有关线程操作的函数4、线程之间的互斥5、线程之间的同步6、试题最终代码1、进程与线程进程是程序执行时的一个实例,即它是程序已经执行到何种程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。一个进程由原创 2013-04-20 13:04:54 · 2125 阅读 · 1 评论 -
linux 线程 pthread_create 源码 剖析
int __pthread_create_2_1(pthread_t *thread, const pthread_attr_t *attr,void * (*start_routine)(void *), void *arg)// thread 为pthread_t,实则是pthread指针。// typedef struct pthread *pthread_t; ->unsigned原创 2013-04-19 16:07:25 · 6560 阅读 · 1 评论 -
linux中wait与waitpid的差别
zombie不占用内存也不占用CPU,表面上我们可以不用在乎它们的存在,然而事实上UNIX系统限制了某一时刻能同时存在的进程的最大数目。如果程序不及时清理系统中的zombie,最终会导致进程数过多,当再次需要产生新进程时就会出错。鉴于上边的原因,我们需要在子进程调用exit后在父进成中调用wait或waipid#include#includepid_t wait(int &stat原创 2013-04-18 23:33:53 · 2160 阅读 · 0 评论 -
Linux信号列表(sigint,sigtstp..)
我们运行如下命令,可看到Linux支持的信号列表:$ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIG原创 2013-04-18 23:01:10 · 20669 阅读 · 0 评论 -
Linux中的system函数的实现和解释
#include #include #include #include intsystem(const char *cmdstring) /* with appropriate signal handling */{ pid_t pid; int status; struct sigaction ignore, saveintr, savequit; sigset原创 2013-04-18 19:26:54 · 4416 阅读 · 0 评论 -
linux C 中的volatile使用
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic原创 2013-04-18 18:22:40 · 3580 阅读 · 0 评论 -
linux c 之sigsuspend 进程阻塞
函数原型: #include int sigsuspend(const sigset_t *mask);作用: 用于在接收到某个信号之前,临时用mask替换进程的信号掩码,并暂停进程执行,直到收到信号为止。 The sigsuspend() function replaces the current signal mask of the原创 2013-04-18 16:32:24 · 3489 阅读 · 0 评论 -
Linux中的可重入函数和不可重入函数
可重入函数可重入函数(即可以被中断的函数)可以被一个以上的任务调用,而不担心数据破坏。可重入函数在任何时候都可以被中断,而一段时间之后又可以恢复运行,而相应的数据不会破坏或者丢失。可重入函数使用的变量有两种情况:1.使用局部变量,变量保存在CPU寄存器中或者堆栈中;2.使用全局变量,但是这时候要注意保护全局变量(防止任务中断后被其它任务改变变量)。原创 2013-04-18 10:25:40 · 6038 阅读 · 0 评论 -
linux系统调用和库函数调用的区别
1、系统调用系统调用提供的函数如open, close, read, write, ioctl等,需包含头文件unistd.h。以write为例:其函数原型为 size_t write(int fd, const void *buf, size_t nbytes),其操作对象为文件描述符或文件句柄fd(file descriptor),要想写一个文件,必须先以可写权限用open系统调用打开原创 2013-04-17 19:17:28 · 1717 阅读 · 0 评论