
《UNIX环境高级编程》
文章平均质量分 77
BruceZhang
计算机专业的一个小学生
展开
-
<UNIX环境高级编程>中的 "apue.h"
/************** * *apueerror.h * *************/ #include #include #include /* for definition of errno */ #include /* ISO C variable aruments */ static void err_doit(int, in转载 2013-04-06 23:47:50 · 3479 阅读 · 2 评论 -
进程间关系
Linux的进程相互之间有一定的关系。比如说,在Linux进程基础中,我们看到,每个进程都有父进程,而所有的进程以init进程为根,形成一个树状结构。我们在这里讲解进程组和会话,以便以更加丰富的方式了管理进程。 1. 进程组 (process group)每个进程都会属于一个进程组(process group),每个进程组中可以包含多个进程。进程组会有一个进程组领导进程 (原创 2013-04-29 12:39:59 · 2348 阅读 · 0 评论 -
POSIX多线程编程-条件变量pthread_cond_t
条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其它的某个线程改变了条件变量,它将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试条件是否满足。一般说来,条件变量被用来进行线承间的同步。 1.条件变量原创 2013-04-21 13:22:48 · 2352 阅读 · 0 评论 -
Linux线程介绍
1、进程与线程2、使用线程的理由3、有关线程操作的函数4、线程之间的互斥5、线程之间的同步6、试题最终代码1、进程与线程进程是程序执行时的一个实例,即它是程序已经执行到何种程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。一个进程由原创 2013-04-20 13:04:54 · 2162 阅读 · 1 评论 -
linux中wait与waitpid的差别
zombie不占用内存也不占用CPU,表面上我们可以不用在乎它们的存在,然而事实上UNIX系统限制了某一时刻能同时存在的进程的最大数目。如果程序不及时清理系统中的zombie,最终会导致进程数过多,当再次需要产生新进程时就会出错。鉴于上边的原因,我们需要在子进程调用exit后在父进成中调用wait或waipid#include#includepid_t wait(int &stat原创 2013-04-18 23:33:53 · 2189 阅读 · 0 评论 -
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 · 6672 阅读 · 1 评论 -
linux C 中的volatile使用
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic原创 2013-04-18 18:22:40 · 3639 阅读 · 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 · 20735 阅读 · 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 · 4521 阅读 · 0 评论 -
Linux终端设备详解
终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。tty是Teletype的缩写。Teletype是最早出现的一种终端设备,很象电传打字机(或者说就是),是由Teletype公司生产的。在Linux系统的设备特殊文件目录/dev/下,终端特殊设备文件一般有以下几种:1.串行端口终端(/dev/ttySn)串行端口终端(Serial Port Term原创 2013-04-27 14:28:15 · 2414 阅读 · 0 评论 -
Linux中的可重入函数和不可重入函数
可重入函数可重入函数(即可以被中断的函数)可以被一个以上的任务调用,而不担心数据破坏。可重入函数在任何时候都可以被中断,而一段时间之后又可以恢复运行,而相应的数据不会破坏或者丢失。可重入函数使用的变量有两种情况:1.使用局部变量,变量保存在CPU寄存器中或者堆栈中;2.使用全局变量,但是这时候要注意保护全局变量(防止任务中断后被其它任务改变变量)。原创 2013-04-18 10:25:40 · 6099 阅读 · 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 · 3545 阅读 · 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 · 1743 阅读 · 0 评论 -
进程间通信--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 · 4158 阅读 · 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 · 2890 阅读 · 0 评论 -
带外数据
定义带 外 数据 想 像一下在银行人们排起队等待处理他们的帐单。在这个队伍中每个人最后都会移到前面由出纳员进行服务。现在想像一下一个走入银行,越过整个队伍,然后用枪抵 住出纳员。这个就可以看作为带 外 数据 。这个强盗越过整个队伍,是因为这把枪给了他凌驾于众人的权力。出纳员也会集中注意力于这个强盗身上,因为他知道当前 的形势是很紧急的。相应的,一个连接的流式套接口上的带 外 数转载 2013-04-24 14:51:12 · 2947 阅读 · 0 评论 -
linux 同步与异步--阻塞与非阻塞型I/O
同步阻塞IO在这个模型中,应用程序(application)为了执行这个read操作,会调用相应的一个system call,将系统控制权交给kernel,然后就进行等待(这其实就是被阻塞了)。kernel开始执行这个system call,执行完毕后会向应用程序返回响应,应用程序得到响应后,就不再阻塞,并进行后面的工作。例如,“在调用 read 系统调用时,应用程序会阻塞并对内核进行上下文切换。转载 2013-09-25 15:20:17 · 2444 阅读 · 0 评论 -
使用system函数时应该忽略两个信号
在8.13节,我们展示了一个system函数的实现。然而,那个版本没有处理信号。POSIX.1要求system忽略SIGINT和SIGQUIT并阻塞SIGCHLD。在展示正确处理这些信号的版本之前,我们看下为什么需要担心这些信号的处理。下 面的代码使用了8.13节的system版本来调用ed编辑器。(这个编辑器作为UNIX系统的一部分已经有很长时间了。我们在这里原创 2013-05-11 16:48:34 · 5073 阅读 · 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 · 6691 阅读 · 1 评论 -
进程控制
程控制的主要任务是对系统中所有进程从产生、存在到消亡的全过程实行有效的管理和控制。进程控制一般是由操作系统的内核来实现,内核在执行操作时,往往是通过执行各种原语操作来实现的,以下介绍进程的各种控制。进程图 有向树 程图是一棵有向树(如左图),结点代表进程,原创 2013-05-04 13:36:17 · 2273 阅读 · 0 评论 -
调用 fork() 两次以避免僵死进程
当我们只fork()一次后,存在父进程和子进程。这时有两种方法来避免产生僵尸进程:父进程调用waitpid()等函数来接收子进程退出状态。父进程先结束,子进程则自动托管到Init进程(pid = 1)。 目前先考虑子进程先于父进程结束的情况: 若父进程未处理子进程退出状态,在父进程退出前,子进程一直处于僵尸进程状态。若父进程调用waitpid()(这里使用原创 2013-05-04 12:33:20 · 6667 阅读 · 0 评论 -
Linux C 实现文件传输
file_server.c 文件传输顺序服务器示例//////////////////////////////////////////////////////////////////////////////////////// file_server.c 文件传输顺序服务器示例///////////////////////////////////////////////////////原创 2013-05-03 14:38:32 · 4030 阅读 · 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 · 6525 阅读 · 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 · 2820 阅读 · 0 评论 -
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 · 5603 阅读 · 1 评论 -
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 · 2691 阅读 · 0 评论 -
Linux下基于socket多线程并发通信的实现
pthread_server.c/*************************************************** * 文件名:pthread_server.c * 文件描述:创建子线程来接收客户端的数据 ***************************************************/ #include #include原创 2013-05-01 18:04:08 · 9947 阅读 · 4 评论 -
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 · 3604 阅读 · 0 评论 -
linux编程下signal()函数
首先说明函数指针的定义形式: 数据类型 (* 函数指针名) (参数表); 其中存储类型一般不写,用默认形式。可以选auto型、static型和extern型等。数据类型是指针所指向函数返回值的数据类型。参数表是指向函数的参数表。 再说明一个函数的返回值是一个函数指针(可理解为此函数A实际返回的是一个指向另一个函数B的指针)的定义形式:原创 2013-04-17 15:25:01 · 2182 阅读 · 0 评论 -
C语言中的typedef
typedef声明,简称 typedef,为现有类型创建一个新的名字。比如人们常常使用 t ypedef来编写更美观和可读的代码。所谓美观,意指typedef能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。 typedef使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。类型出现在所声明的变量名字中,位于 ''typedef''关键字右边原创 2013-04-22 15:19:44 · 1988 阅读 · 0 评论 -
GDB的使用方法
一、GDB的静态调试启动方法:1、当需要在命令行通过gdb来启动可执行程序的时候,可使用一下命令: gdb 这个时候gdb会加载可执行程序的符号表和堆栈,并为启动程序作好准备; 接下来,需要设置可执行程序的命令行参数: set args 然后设置断点: b或break; 最后通过命令r或run来启动程序,或者通过c或continue命令来继续原创 2013-04-12 23:35:51 · 3675 阅读 · 0 评论 -
Linux密码文件passwd和shadow分析
引言:与Linux密码密切相关的两个文件 一:关于/etc/passwd: 关于/etc/passwd的内容理解在/etc/passwd 中,每一行都表示的是一个用户的信息;一行有7个段位;每个段位用:号分割,比如下面是我的系统中的/etc/passwd 的两行;beinan:x:500:500:beinan sun:/home/beinan:/bi原创 2013-04-12 20:17:53 · 3827 阅读 · 0 评论 -
线程同步----递归锁
概述最常见的进程/线程的同步方法有互斥锁(或称互斥量Mutex),读写锁(rdlock),条件变量(cond),信号量(Semophore)等。在Windows系统中,临界区(Critical Section)和事件对象(Event)也是常用的同步方法。 简单的说,互斥锁保护了一个临界区,在这个临界区中,一次最多只能进入一个线程。如果有多个进程在同一个临界区内活动,就有可能产生竞态条件原创 2013-04-22 14:26:22 · 3734 阅读 · 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 · 7290 阅读 · 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 · 2611 阅读 · 1 评论 -
链表
/*链表*/ #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 · 1439 阅读 · 0 评论 -
<UNIX环境高级编程>--第七章
1进程终止进程正常终止:view plaincopy to clipboard#include void exit(int status); void _Exit(int status); #include void _exit(int status); [cpp] view p原创 2013-04-13 16:39:43 · 1522 阅读 · 0 评论 -
关于path_alloc函数(APUE)
#include "apue.h" #include #include #ifdef PATH_MAX static int pathmax = PATH_MAX; #else static int pathmax = 0; #endif #define SUSV3 200112L static long posix_version = 0;原创 2013-04-11 22:09:51 · 4188 阅读 · 0 评论 -
Linux中的清屏命令
1. clear$ clear屏幕刷新了,这个命令本质上只是让终端页向后翻了一页,向上滚动屏幕还是能看到之前终端屏幕的残留信息。2.reset$reset屏幕刷新了,之前的终端屏幕信息没有了,缺点是很慢,大概要一秒钟。原创 2013-04-10 22:18:58 · 5777 阅读 · 0 评论 -
《UNIX环境高级编程》--du命令
Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的.1.命令格式:du [选项][文件]2.命令功能:显示每个文件和目录的磁盘使用空间。3.命令参数:-a或-all 显示目录中个别文件的大小。 -b或-bytes 显示目录或文件大小时,以by原创 2013-04-10 10:53:58 · 2314 阅读 · 0 评论