⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mynamepipe_linux.c

📁 sourceforge历史版本完整下载: http://sourceforge.net/project/showfiles.php?group_id=202044 提供了基于b树索引算法的文件数据数据
💻 C
字号:
/**
 *
 * @file mynamepipe.c 命名管道 2007-8-23 23:41
 *
 * @author diablo 
 *
 */
#include "mynamepipe.h"

#include <assert.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ipc.h>

#include "os_def.h"

#include "mybuffer.h"
#include "mylog.h"


typedef struct __mynamepipe_t_
{
	/*
	* 存放管道名字的缓冲区
	*/
	HMYBUFFER hbuf_name;
	
	/*
	* 记录是否是当前对象创建了这个管道,用于对象析构时判断是否unlink
	*/
	int bcreate;
	
	/*
	* 管道的fd
	*/
	int fd;
	
	/*
	* 内存池标识
	*/
	HMYMEMPOOL hm;
}mynamepipe_t;


/**
 * @brief 销毁命名管道
 */
static __INLINE__ void name_pipe_destroy(mynamepipe_t * p)
{
	assert(p);
	
	close(p->fd);
	if(p->bcreate && p->hbuf_name)
	{
		LOG_INFO(("unlink name pipe %s", MyBufferGet(p->hbuf_name, NULL)));
		unlink((char *)MyBufferGet(p->hbuf_name, NULL));
	}

	MyBufferDestruct(p->hbuf_name);
	
	MyMemPoolFree(p->hm, p);
}


/**
 * @brief 创建命名管道
 */
HMYNAMEPIPE MyNamePipeConstruct(HMYMEMPOOL hm, const char * name, int bcreate)
{
	mynamepipe_t * p = (mynamepipe_t *)MyMemPoolMalloc(hm, sizeof(*p));
	if(NULL == p)
		return NULL;
	
	p->hm = hm;
	p->bcreate = bcreate;
	
	if(NULL == name)
		goto MyNamePipeConstruct_end_;

	p->hbuf_name = MyBufferConstruct(hm, 0);
	if(NULL == p->hbuf_name)
		goto MyNamePipeConstruct_end_;

	MyBufferSet(p->hbuf_name, name, strlen(name));
	MyBufferAppend(p->hbuf_name, "\0", 1);

	/*
	* 创建管道
	*/
	if(bcreate)
	{
		unlink(name);
		if(mkfifo(name, 0666) != 0)
			goto MyNamePipeConstruct_end_;
	}

	/*
	* 打开管道句柄
	*/
	p->fd = open(name,IPC_CREAT|O_RDWR| O_NONBLOCK);
	if(-1 == p->fd)
		goto MyNamePipeConstruct_end_;
		
	return (HMYNAMEPIPE)p;

MyNamePipeConstruct_end_:
	
	name_pipe_destroy(p);
	
	return NULL;
}
 
/**
 * @brief 销毁命名管道
 */
void MyNamePipeDestruct(HMYNAMEPIPE hnp)
{
	mynamepipe_t * p = (mynamepipe_t *)hnp;
	if(NULL == p)
		return;

	name_pipe_destroy(p);
}

/**
 * @brief 获取管道的fd
 */
int MyNamePipeGetFd(HMYNAMEPIPE hnp)
{
	mynamepipe_t * p = (mynamepipe_t *)hnp;
	if(NULL == p)
		return INVALID_FD;
		
	return p->fd;
}
 
/**
 * @brief 写
 */
int MyNamePipeWrite(HMYNAMEPIPE hnp, const void * data, size_t data_len)
{
	mynamepipe_t * p = (mynamepipe_t *)hnp;
	if(NULL == p)
		return -1;
		
	return write(p->fd, data, data_len);
}
 
/**
 * @brief 读
 */
int MyNamePipeRead(HMYNAMEPIPE hnp, void * data, size_t data_len)
{
	mynamepipe_t * p = (mynamepipe_t *)hnp;
	if(NULL == p)
		return -1;

	return read(p->fd, data, data_len);
}







⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -