摘要: 一 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 在最后一个共享内存从进... 阅读全文
posted @ 2014-01-16 15:35 LOSER Z 阅读(1534) 评论(0) 推荐(0) 编辑
摘要: 一 关于消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法,而且,每个数据块都被认为含有一个类型,接收进程可以独立地接受含有不同类型值的数据块。可以通过发送消息来几乎完全避免命名管道的同步和阻塞问题。但是,与管道一样,每个数据块都有一个最大长度的限制,系统中所有队列所包含的全部数据块的总长度都有一个上限。 与命名管道相比,消息队列的优势是,它独立于发送和接受进程而存在,这消除了在同步命名管道的打开和关闭时可能产生的一些困难。二 相关函数#include //msgget函数创建和访问一个消息队列int msgget(key_t key, int msgflg ... 阅读全文
posted @ 2014-01-16 12:46 LOSER Z 阅读(514) 评论(0) 推荐(0) 编辑
摘要: 一 共享内存 共享内存是由IPC为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中。其他进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址。如果某个进程向共享内存写入了数据,所做的改动将立刻被可以访问同一段共享内存的任何其他进程看到。二 相关函数#include //shmget创建共享内存int shmget(key_t key, //为共享内存段命名 size_t size, //以字节为单位指定需要共享的内存容量 int shmflg //权限标志。允许一个进程创建的共享内存可以被共享内存... 阅读全文
posted @ 2014-01-15 20:44 LOSER Z 阅读(438) 评论(0) 推荐(0) 编辑
摘要: 一 信号量的基本概念 信号量:它是一个特殊变量,只允许对它进行等待和发送信号这两种操作。 假设有一个信号量变量sv P(sv):用于等待,如果sv的值大于零,就给它减去1,如果它的值等于零,就挂起该进程的执行。 V(sv):用于发送信号,如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而被挂起,就给它加1二 信号量的相关函数#include //semctl函数的作用是用来直接控制信号量信息int semctl(int sem_id, //由semget返回的信号量标识符 int sem_num, //是信号... 阅读全文
posted @ 2014-01-15 17:16 LOSER Z 阅读(397) 评论(0) 推荐(0) 编辑
摘要: 1 命名管道(FIFO) 管道应用的一个重大缺陷就是没有名字,因此只能用于亲缘进程之间的通信。后来从管道为基础提出命名管道(named pipe,FIFO)的概念,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据。值得注意的是,FIFO严格遵循先进先出(first in first out),对管道及FIFO的读总是从开始处返回数据,对它们的 阅读全文
posted @ 2014-01-14 20:09 LOSER Z 阅读(1441) 评论(0) 推荐(1) 编辑
摘要: 一 管道的作用 通常把一个进程的输出通过管道连接到另一个进程的输入。二 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 以运行命... 阅读全文
posted @ 2014-01-14 11:01 LOSER Z 阅读(486) 评论(0) 推荐(0) 编辑
摘要: 一 相关函数 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 设置取... 阅读全文
posted @ 2014-01-04 10:05 LOSER Z 阅读(488) 评论(0) 推荐(0) 编辑
摘要: 本文来自博客园: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_... 阅读全文
posted @ 2014-01-03 18:54 LOSER Z 阅读(492) 评论(0) 推荐(0) 编辑
摘要: 一 用信号量同步 1 信号量函数的名字都以sem_开头,线程中使用的基本信号量函数有4个 2 创建信号量 #includeint sem_init(sem_t *sem, //指向信号量结构的一个指针 int pshared, //控制信号量的类型,如果其值为0,就表示这个信号量是当前进程的局部信号量,否则,这个信号量就可以在多个进程之间共享 unsighed int value //信号量的初始值 ); 这个函数初始化由sem指向的信号量对象,设置它的共享选项,并给它的一个初始的整数值。 3 信号量操作函数#in... 阅读全文
posted @ 2014-01-03 13:46 LOSER Z 阅读(448) 评论(0) 推荐(0) 编辑
摘要: 一 什么是线程 线程:是一个进程内部的一个控制序列。二 使用POSIX的注意点 1 为了使用线程函数库,必须定义宏_REENTRANT,通过定义_REENTRANT来告诉编译器我们需要可重入功能,可重入代码可以被多次调用而仍然正常工作。 2 在程序中包含头文件pthread.h,并且在编译程序时需要用选项-lpthread来链接线程库。三创建线程程序前的准备 1 创建线程#include int pthread_create(pthread_t *thread, //指向变量中将被写入一个标识符的指针 pthread_attr_t *attr, ... 阅读全文
posted @ 2014-01-02 11:52 LOSER Z 阅读(351) 评论(0) 推荐(0) 编辑
摘要: 上一节中讲到了sigprocmask函数,它的作用是检查或修改它的进程信号掩码,这一节我们主要学习捕捉与忽略信号的函数sigaction和等待信号函数。一 sigaction函数的作用 定义在接收到参数sig指定的信号后应该采取的行动,声明如下:#include int sigaction(int sig, //指定动作的信号码 const struct sigaction * act, //说明要采取的动作,如果为NULL,对sigaction的调用就不能改变与信号相关的动作 struct sigaction *oact ... 阅读全文
posted @ 2013-12-31 15:40 LOSER Z 阅读(548) 评论(0) 推荐(0) 编辑
摘要: 一 信号的基本概念 信号:是向进程发送的软件通知,通知进程有事件发生。 生成:表示一个信号的产生。 捕获:表示接收到一个信号。 信号的寿命:信号的生成和传递之间的时间间隔。 挂起的信号:已经生成但还未被传递的信号。二 产生信号 每个信号名都是以SIG开头,信号的名字都定义在signal.h中,POSIX必需的信号如下: 信号 描述 SIGABRT 进程放弃(signal abort) SIGALRM 告警时钟(signal alarm) SIGBUS 访问了内存对象中的为定义部分 SIGCHLD 子进程被终... 阅读全文
posted @ 2013-12-30 22:44 LOSER Z 阅读(720) 评论(0) 推荐(0) 编辑
摘要: 1 何谓输入输出重定向?默认情况下输入是由键盘输入的。输出是默认的输出到屏幕上。而输入输出重定向就是改变默认的输入输出方向 2 freopen函数freopen是被包含与stdio.h头文件中,是重定向输入输出流的函数。此函数一般用于将一个指定的文件打开一个预定义的流:标准输入、标准输出或者标准出错。声明:FILE *freopen( const char *path, //文件名,用于存储输入输出的自定义文件名 const char *mode, //文件打开的模式。和fopen中的模式(如r-只读, w-写)相同 FILE *stre... 阅读全文
posted @ 2013-12-28 17:15 LOSER Z 阅读(635) 评论(0) 推荐(0) 编辑
摘要: wait函数的定义如下:#include #include pid_t wait(int *stat_loc); wait系统调用将暂停父进程直到它的子进程结束为止,这个调用返回子进程的PID,它通常是已经结束运行的子进程的PID。状态信息允许父进程了解子进程的退出状态,即子进程的main函数返回的值或子进程中exit函数的退出码。如果stat_loc不是空指针,状态信息将被写入它所指向的位置。 状态信息如下:WIFEXITED(stat_val) 如果子进程正常结束,它就取一个非零值 WEXITSTATUS(stat_val) 如果WIFEXITED非零,它... 阅读全文
posted @ 2013-12-28 16:14 LOSER Z 阅读(1172) 评论(0) 推荐(0) 编辑
摘要: GDB 命令详细解释Linux中包含有一个很有用的调试工具--gdb(GNU Debuger),它可以用来调试C和C++程序,功能不亚于Windows下的许多图形界面的调试工具。和所有常用的调试工具一样,gdb提供了以下功能: # 监视程序中变量的值 # 在程序中设置断点 # 程序的单步执行在使用gdb前,必须先载入可执行文件,因为要进行调试,文件中就必须包含调试信息,所以在用gcc或cc编译时就需要用-g参数来打开程序的调试选项。调试开始时,必须先载入要进行调试的程序,可以用以下两种方式: * 在启动gdb后执行以下命令: file 可执行文件路径 * 在gdb启动时就载入程序: g... 阅读全文
posted @ 2013-12-28 13:34 LOSER Z 阅读(415) 评论(0) 推荐(0) 编辑
摘要: 期末考试快要来了,Linux学习进度一下拉下来许多。今天学习的是文件锁定,在Linux中,实现文件锁定的方法很多,例如fcntl和lockf。下面主要是fcntl的调用。 fcntl函数的原型是:int fcntl( int fd, //文件标识符 int command, //这个具体选项看学习笔记11,最后有具体介绍,这里主要用到的是F_GETLK、F_SETLK或F_SETLKW struct flock* flock_structure //文件锁结构体 ); 上... 阅读全文
posted @ 2013-12-24 21:23 LOSER Z 阅读(565) 评论(0) 推荐(0) 编辑
摘要: 一 安装curses库 如果你的Linux系统中curses库,直接敲入命令sudo apt-get install libncurses5-dev,然后就会自动安装curses库,安装好之后敲入命令: ls -l /usr/include/*curses.h,我上面显示的是这样:二 curses库有什么作用 curses函数库能够优化光标的移动并最小化需要对屏幕进行的刷新,从而也减少了必须向字符终端发送的字符数目。三 认识curses库 1:curses函数库用两个数据结构来映射终端屏幕,它们是stdscr和curscr。 stdscr数据结构对应的是标准屏幕(在窗口下,这个一... 阅读全文
posted @ 2013-12-19 21:18 LOSER Z 阅读(1480) 评论(0) 推荐(0) 编辑
摘要: 通过调用fork和exec函数都能创建新的进程,但两者有着本质的区别:fork函数拷贝了父进程的内存映像,而exec函数用用新的映像来覆盖调用进程的进程映像的功能。一 fork函数 #include pid_t fork(void); //创建子进程成功时,向子进程返回0,并将子进程的进程ID返回给父进程 //创建失败时,返回-1,并将errno设置为EAGAIN 返回值是允许父进程和子进程区别自己并执行不同代码的关键特征。#include #include #include int main(void){ pid_t childpi... 阅读全文
posted @ 2013-12-18 23:12 LOSER Z 阅读(431) 评论(0) 推荐(0) 编辑
摘要: 通用的进程状态包括:新建、运行、阻塞、就绪和完成。状态图如下: 如果一个程序正在向活动进程转换,就称其处于新建。 转换之后,操作系统将进程放入一个准备好执行的进程队列中,这时进程就处于就绪状态。 进程实际在CPU中执行时,它就处于运行状态。 处于等待事件,不能被选中执行的进程处于阻塞状态。 上下文切换:将一个进程从运行状态移出,并用另一个进程来替代它的行为。 进程上下文:操作系统在上下文切换之后重启进程所需的、有关此进程及其环境的信息。 阅读全文
posted @ 2013-12-18 13:21 LOSER Z 阅读(512) 评论(0) 推荐(0) 编辑
摘要: 大家都知道,栈是先进后出,队列是先进先出的。那么如何使用栈来完成队列的功能,又如何用队列完成栈的功能呢?一、两个栈实现队列 两个栈实现队列的方法就是将一个栈用来当作进入元素的入口,当要取出元素的时候,就将这个栈中的元素转入到另外一个栈中,由于先进后出,此时第二个栈中的元素顺序就和第一个栈中的元素顺序相反,这样就实现了一个队列的功能。具体流程如下: 1、将元素进栈 2、当需要先删除队头元素时,先检查stack2是否为空,如果为空,就将stack1中的元素转移至stack2中,否则直接删除stack2中的元素 然后删除元素4 当需要添加新元素5时,就将5添加到stack1中 ... 阅读全文
posted @ 2013-12-17 17:27 LOSER Z 阅读(2213) 评论(0) 推荐(3) 编辑