unpipc.h

#ifndef _UNPIPC_H
#define _UNPIPC_H #include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <limits.h>
#include <stdarg.h>
#include <signal.h> #define MAXLINE 1024
//定义一个新类型Sigfunc,该类型的变量是一个带有一个int型参数,没有返回值的函数
typedef void Sigfunc(int); void err_quit(char *fmt,...);
void Write(int fd,void *buf,size_t nbytes);
ssize_t Read(int fd,void *buf,size_t nbytes);
int Open(const char *pathname,int flags,mode_t mode);
void Close(int fd);
void Unlink(const char *pathname);
void Fputs(const char *buf,FILE *fp);
char *Fgets(char *buf,int nbytes, FILE *fp); pid_t Fork(void); Sigfunc *Signal(int signo,Sigfunc *);
void Sigemptyset(sigset_t *set);
void Sigaddset(sigset_t *set,int signo);
void Sigprocmask(int command,sigset_t *set,sigset_t *oset);
void Sigwait(const sigset_t *set,int *signo); void *Malloc(size_t size); #endif

unpipc.c

#include "unpipc.h"

void err_quit(char *fmt,...){
int errno_save=errno;
va_list va;
va_start(va,fmt);
vfprintf(stderr,fmt,va);
if(errno_save != 0)
fprintf(stderr," :%s",strerror(errno_save));
fprintf(stderr,"\n",va);
va_end(va);
exit(0);
}
void Write(int fd,void *buf,size_t nbytes){
if(write(fd,buf,nbytes) != nbytes)
err_quit("write error");
}
ssize_t Read(int fd,void *buf,size_t nbytes){
size_t nread=read(fd,buf,nbytes);
if(-1 == nread)
err_quit("read error");
return nread;
}
int Open(const char *pathname,int flags,mode_t mode){
int fd=open(pathname,flags,mode);
if(-1 == fd)
err_quit("open error");
return fd;
}
void Close(int fd){
if(close(fd) == -1)
err_quit("close error");
}
void Unlink(const char *pathname){
if(unlink(pathname) == -1)
err_quit("unlink error");
}
pid_t Fork(void){
pid_t pid;
if((pid=fork())<0)
err_quit("fork error");
return pid;
}
void Fputs(const char *buf, FILE *fp){
if(fputs(buf,fp) == EOF)
err_quit("fputs error");
}
char *Fgets(char *buf,int nbytes,FILE *fp){
char *ptr=fgets(buf,nbytes,fp);
if((ptr==NULL) && (ferror(fp)))
err_quit("fgets error");
return ptr;
}
Sigfunc *Signal(int signo,Sigfunc *func){
Sigfunc *sigfunc=signal(signo,func);
if(SIG_ERR == sigfunc)
err_quit("signal error");
return(sigfunc);
}
void *Malloc(size_t size){
void *ptr=malloc(size);
if(NULL == ptr)
err_quit("malloc error");
return(ptr);
}
void Sigemptyset(sigset_t *set){
if(sigemptyset(set) == -1)
err_quit("sigemptyset error");
}
void Sigaddset(sigset_t *set,int signo){
if(sigaddset(set,signo) == -1)
err_quit("sigaddset error");
}
void Sigprocmask(int command,sigset_t *set,sigset_t *oset){
if(sigprocmask(command,set,oset) == -1)
err_quit("sigprocmask error");
}
void Sigwait(const sigset_t *set,int *signo){
if(sigwait(set,signo) != 0)
err_quit("sigwait error");
}

unpipc.h&unpipc.c的更多相关文章

  1. px_ipc_name.c

    /* include px_ipc_name */ #include "unpipc.h" char * px_ipc_name(const char *name) { char ...

  2. Posix 共享内存区

    要点 与mmap配合使用 open与shm_open的区别,open打开磁盘上的普通文件,shm_open创建和打开的文件在/dev/shm文件夹下,该文件夹对应的是内存 gcc编译时加参数-lrt ...

  3. System V信号量

    信号量对比 二值信号量:其值要么0要么1,比如互斥锁就是这种类型 计数信号量:其值为0或某个正整数,比如POSIX 信号量 计数信号量:一个或多个信号量构成一个集合,每个都是计数信号量,比如Syste ...

  4. Posix 信号量

    作用 信号量的值为0或正整数,就像红灯与绿灯,用于指示当前是否可以接受任务. 信号量对进程和线程都适用. gcc编译时需加-lpthread 基本函数 信号量的相关函数与标准文件函数非常相似,可以理解 ...

  5. System V消息队列

    消息的基本属性 System V的消息属性包含在一个msqid_ds的结构中 struct msqid_ds{ struct ipc_cerm msg_perm; //读取权限, 0644, 0777 ...

  6. posix 消息队列

    注意 在涉及到posix消息的函数时, gcc 编译时要加-lrt参数, 如 gcc -lrt unpipc.c mqpack.c send.c -o send gcc -lrt unpipc.c m ...

  7. 【读书笔记】管道和FIFO

    管道 提供一个单路(单向)数据流,可以为两个不同进程提供进程间的通信手段 #include <unistd.h> ]); 返回两个文件描述符,fd[0](读) 和 fd[1](写) 管道间 ...

  8. UNIX环境高级编程——System V 共享内存区

    共享内存区域是被多个进程共享的一部分物理内存.如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信.共享内存是进程间共享数据的一种最 ...

  9. UNIX环境高级编程——管道和FIFO限制

    系统加于管道和FIFO的唯一限制为: OPEN_MAX     一个进程在任意时刻打开的最大描述符数: PIPE_BUF       可原子的写往一个管道或FIFO的最大数据量. OPEN_MAX的值 ...

随机推荐

  1. leetcode题解:Tree Level Order Traversal II (二叉树的层序遍历 2)

    题目: Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from ...

  2. 安装 vsftpd

    (1)安装vsftpdsudo apt-get install vsftpd (2)配置sudo vi /etc/vsftpd.conf #anonymous_enable=YESlocal_enab ...

  3. 使你的 Google Summer of Code 建议被接收的5个技巧

    本文翻译自:http://www.di.ens.fr/~baghdadi/TXT_blog/5_advices_to_get_your_proposal_accepted.lyx.html 本文讲的主 ...

  4. webapp新体验Rem实现移动端网页适配详解资源

    本来想写一篇,webapp使用Rem的问题,查了一下相关rem的介绍之后,发现很多平台已经解释的很清楚了,图文并茂,于是我便想将其解释资源整理一些,方便以后自己查阅. 腾讯ISUX:web app变革 ...

  5. 51nod 数数字(水题)

    题目链接: 数数字 基准时间限制:1 秒 空间限制:262144 KB 统计一下 aaa ⋯ aaa n个a × b 的结果里面有多少个数字d,a,b,d均为一位数. 样例解释: 3333333333 ...

  6. 根据不同的浏览器对不同元素进行css调整

    <!if firefox> .element { top:4px; } <![endif]> <!if chrome> .element { top:6px; } ...

  7. Oracle中的内置函数在sql中的转换整理

    程序里面经常会即支持Oracle数据库,又支持sql数据库.而有些Oracle内置函数用的比较多,但在sql中语法有些不同,我做了些整理,希望可以帮助大家.... 1.oracle中的内置函数:ora ...

  8. C# 中 static 的用法

    说明1: 表示静态的关键字说明此对象在应用中只存在一份 说明2:C# 是面向对象的程序设计语言,每一个函数都属于一个类. 当 一个方法被声明为Static时,这个方法是一个静态方法,编译器会在编译时保 ...

  9. 【原创】Oracle函数中对于NO_DATA_FOUND异常处理的研究

    一直以来有一个困惑,一直没解决,昨天一哥们问我这个问题,决心弄清楚,终于得到了答案.先看下面这个函数: create or replace function fn_test(c_xm varchar) ...

  10. Cocos2d-JS中的精灵菜单和图片菜单

    精灵菜单的菜单项类是cc.MenuItemSprite,图片菜单的菜单项类是cc.MenuItemImage.由于cc.MenuItemImage继承于cc.MenuItemSprite,所以图片菜单 ...