随笔分类 - Linux程序设计
摘要:Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等 待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。可是使用Select就可以完成非阻塞(所谓非阻塞方式non- block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相 同,若事件没有发生则返回一个代码来告知..
阅读全文
摘要:一 主机数据库函数#include struct hostent *gethostbyaddr(const void *addr, //地址 size_t len, //长度 int type //类型 );struct hostent *gethostbyname(const char *name); 这些函数返回的结构中至少包含以下几个成员struct hostent{ char *h_name; //主机名称 ...
阅读全文
摘要:一 什么是套接字 套接字是一种通信机制,凭借这种机制,客户/服务器系统的开发既可以在本地单机上进行,也可以跨网络进行。 二 套接字属性 套接字的特性由3个属性确定,它们是:域,类型和协议 1 套接字的域 域指定套接字通信中的网络介质,最常见的套接字域是AF_INET,它指的是Internet网络,其底层的协议——网际(IP)只有一个地址族,它使用一种特定的方式来指定网络中的计算机,即人们常说的IP地址。 AF_UNIX域是UNIX文件系统域,即使是一台还没联网的计算机上的套接字也可以使用这个域,这个域的底层协议是文件输入/输出,而它的地址就是文件名。 2 套接字类型 ...
阅读全文
摘要:一 IPC IPC是进程间通讯,在前面,我们相继学习了进程间通讯机制有信号量,内存共享,消息队列。状态命令(ipcs)和删除命令(ipcrm)提供了一种检查和清理IPC机制的方法。二 状态命令 1 显示信号量状态用ipcs -s 2 显示共享内存状态用ipcs -m 3 显示消息队列状态用ipcs -q 4 显示所有状态用ipcs -a 5 按创建者查看ipcs -c 6 按创建时间查看ipcs -t 7 按限制的内存查看ipcs -l 8 按进程号类型查看ipcs -p 9 按摘要查看ipcs -u三 删除命令 1 ipcrm -M shmkey 在最后一个共享内存从进...
阅读全文
摘要:一 关于消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法,而且,每个数据块都被认为含有一个类型,接收进程可以独立地接受含有不同类型值的数据块。可以通过发送消息来几乎完全避免命名管道的同步和阻塞问题。但是,与管道一样,每个数据块都有一个最大长度的限制,系统中所有队列所包含的全部数据块的总长度都有一个上限。 与命名管道相比,消息队列的优势是,它独立于发送和接受进程而存在,这消除了在同步命名管道的打开和关闭时可能产生的一些困难。二 相关函数#include //msgget函数创建和访问一个消息队列int msgget(key_t key, int msgflg ...
阅读全文
摘要:一 共享内存 共享内存是由IPC为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中。其他进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址。如果某个进程向共享内存写入了数据,所做的改动将立刻被可以访问同一段共享内存的任何其他进程看到。二 相关函数#include //shmget创建共享内存int shmget(key_t key, //为共享内存段命名 size_t size, //以字节为单位指定需要共享的内存容量 int shmflg //权限标志。允许一个进程创建的共享内存可以被共享内存...
阅读全文
摘要:一 信号量的基本概念 信号量:它是一个特殊变量,只允许对它进行等待和发送信号这两种操作。 假设有一个信号量变量sv P(sv):用于等待,如果sv的值大于零,就给它减去1,如果它的值等于零,就挂起该进程的执行。 V(sv):用于发送信号,如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而被挂起,就给它加1二 信号量的相关函数#include //semctl函数的作用是用来直接控制信号量信息int semctl(int sem_id, //由semget返回的信号量标识符 int sem_num, //是信号...
阅读全文
摘要:1 命名管道(FIFO) 管道应用的一个重大缺陷就是没有名字,因此只能用于亲缘进程之间的通信。后来从管道为基础提出命名管道(named pipe,FIFO)的概念,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据。值得注意的是,FIFO严格遵循先进先出(first in first out),对管道及FIFO的读总是从开始处返回数据,对它们的
阅读全文
摘要:一 管道的作用 通常把一个进程的输出通过管道连接到另一个进程的输入。二 popen和pclose函数#include FILE *popen(const char *command, //是要运行的程序名和相应的参数 const char *open_mode //必须是“r”或者“w”,如果是其它值,errno将返回EINVAL ); int pclose(FILE *stream_to_close); popen() 函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命...
阅读全文
摘要:一 相关函数 1 发送终止信号#include int pthread_cancel(pthread_t thread); 2 设置取消状态#include int pthread_setcancelstate(int state, //取值:1 PTHREAD_CANCEL_ENABLE,这个值允许线程接受取消请求 // 2 PTHREAD_CANCEL_DISABLE,它的作用是忽略取消请求 int *oldstate //用于获取先前的取消状态 ); 3 设置取...
阅读全文
摘要:本文来自博客园:http://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764204.html一.线程属性线程具有属性,用pthread_attr_t表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化。我们用pthread_attr_init函数对其初始化,用pthread_attr_destroy对其去除初始化。 1.名称:pthread_attr_init/pthread_attr_destroy 功能:对线程属性初始化/去除初始化 头文件:#include 函数原形:int pthread_...
阅读全文
摘要:一 用信号量同步 1 信号量函数的名字都以sem_开头,线程中使用的基本信号量函数有4个 2 创建信号量 #includeint sem_init(sem_t *sem, //指向信号量结构的一个指针 int pshared, //控制信号量的类型,如果其值为0,就表示这个信号量是当前进程的局部信号量,否则,这个信号量就可以在多个进程之间共享 unsighed int value //信号量的初始值 ); 这个函数初始化由sem指向的信号量对象,设置它的共享选项,并给它的一个初始的整数值。 3 信号量操作函数#in...
阅读全文
摘要:一 什么是线程 线程:是一个进程内部的一个控制序列。二 使用POSIX的注意点 1 为了使用线程函数库,必须定义宏_REENTRANT,通过定义_REENTRANT来告诉编译器我们需要可重入功能,可重入代码可以被多次调用而仍然正常工作。 2 在程序中包含头文件pthread.h,并且在编译程序时需要用选项-lpthread来链接线程库。三创建线程程序前的准备 1 创建线程#include int pthread_create(pthread_t *thread, //指向变量中将被写入一个标识符的指针 pthread_attr_t *attr, ...
阅读全文
摘要:上一节中讲到了sigprocmask函数,它的作用是检查或修改它的进程信号掩码,这一节我们主要学习捕捉与忽略信号的函数sigaction和等待信号函数。一 sigaction函数的作用 定义在接收到参数sig指定的信号后应该采取的行动,声明如下:#include int sigaction(int sig, //指定动作的信号码 const struct sigaction * act, //说明要采取的动作,如果为NULL,对sigaction的调用就不能改变与信号相关的动作 struct sigaction *oact ...
阅读全文
摘要:一 信号的基本概念 信号:是向进程发送的软件通知,通知进程有事件发生。 生成:表示一个信号的产生。 捕获:表示接收到一个信号。 信号的寿命:信号的生成和传递之间的时间间隔。 挂起的信号:已经生成但还未被传递的信号。二 产生信号 每个信号名都是以SIG开头,信号的名字都定义在signal.h中,POSIX必需的信号如下: 信号 描述 SIGABRT 进程放弃(signal abort) SIGALRM 告警时钟(signal alarm) SIGBUS 访问了内存对象中的为定义部分 SIGCHLD 子进程被终...
阅读全文
摘要:1 何谓输入输出重定向?默认情况下输入是由键盘输入的。输出是默认的输出到屏幕上。而输入输出重定向就是改变默认的输入输出方向 2 freopen函数freopen是被包含与stdio.h头文件中,是重定向输入输出流的函数。此函数一般用于将一个指定的文件打开一个预定义的流:标准输入、标准输出或者标准出错。声明:FILE *freopen( const char *path, //文件名,用于存储输入输出的自定义文件名 const char *mode, //文件打开的模式。和fopen中的模式(如r-只读, w-写)相同 FILE *stre...
阅读全文
摘要:wait函数的定义如下:#include #include pid_t wait(int *stat_loc); wait系统调用将暂停父进程直到它的子进程结束为止,这个调用返回子进程的PID,它通常是已经结束运行的子进程的PID。状态信息允许父进程了解子进程的退出状态,即子进程的main函数返回的值或子进程中exit函数的退出码。如果stat_loc不是空指针,状态信息将被写入它所指向的位置。 状态信息如下:WIFEXITED(stat_val) 如果子进程正常结束,它就取一个非零值 WEXITSTATUS(stat_val) 如果WIFEXITED非零,它...
阅读全文
摘要:GDB 命令详细解释Linux中包含有一个很有用的调试工具--gdb(GNU Debuger),它可以用来调试C和C++程序,功能不亚于Windows下的许多图形界面的调试工具。和所有常用的调试工具一样,gdb提供了以下功能: # 监视程序中变量的值 # 在程序中设置断点 # 程序的单步执行在使用gdb前,必须先载入可执行文件,因为要进行调试,文件中就必须包含调试信息,所以在用gcc或cc编译时就需要用-g参数来打开程序的调试选项。调试开始时,必须先载入要进行调试的程序,可以用以下两种方式: * 在启动gdb后执行以下命令: file 可执行文件路径 * 在gdb启动时就载入程序: g...
阅读全文
摘要:期末考试快要来了,Linux学习进度一下拉下来许多。今天学习的是文件锁定,在Linux中,实现文件锁定的方法很多,例如fcntl和lockf。下面主要是fcntl的调用。 fcntl函数的原型是:int fcntl( int fd, //文件标识符 int command, //这个具体选项看学习笔记11,最后有具体介绍,这里主要用到的是F_GETLK、F_SETLK或F_SETLKW struct flock* flock_structure //文件锁结构体 ); 上...
阅读全文
摘要:一 安装curses库 如果你的Linux系统中curses库,直接敲入命令sudo apt-get install libncurses5-dev,然后就会自动安装curses库,安装好之后敲入命令: ls -l /usr/include/*curses.h,我上面显示的是这样:二 curses库有什么作用 curses函数库能够优化光标的移动并最小化需要对屏幕进行的刷新,从而也减少了必须向字符终端发送的字符数目。三 认识curses库 1:curses函数库用两个数据结构来映射终端屏幕,它们是stdscr和curscr。 stdscr数据结构对应的是标准屏幕(在窗口下,这个一...
阅读全文

浙公网安备 33010602011771号