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

📄 example2-06.c

📁 Linux网络测试程序
💻 C
字号:
/************************************************************* 
 * 用消息队列实现的进程间通信的例子example2-05.c  example2-06.c
 ************************************************************/

/*****************************************  
 * 消息队列实例  客户端程序example2-06.c
 *****************************************/

#include	<sys/msg.h>
#include	<sys/ipc.h>
#include	<stdio.h>

#define MAXMESGDATA     1000
#define SVMSG_MODE      777

struct mymesg {
        long        mesg_len;       /* #bytes in mesg_data, can be 0 */
        long        mesg_type;      /* message type, must be > 0 */
        char        mesg_data[MAXMESGDATA];
};
	
size_t msg_send(int id, struct mymesg *mptr)
{
	return(msgsnd(id, &(mptr->mesg_type), mptr->mesg_len, 0));
}

/* end mesg_send */
size_t mesg_recv(int id, struct mymesg *mptr)
{
	ssize_t	n;

	n = msgrcv(id, &(mptr->mesg_type), MAXMESGDATA, mptr->mesg_type, 0);
	mptr->mesg_len = n;		/* return #bytes of data */

	return(n);				/* -1 on error, 0 at EOF, else >0 */
}

int
main()
{
	int		msgid;
	size_t		len;
	ssize_t 	n;
	char		*ptr;
	struct mymesg	mesg;

	msgid = msgget(4321, 0);	/* 打开消息队列 */
	snprintf(mesg.mesg_data, MAXMESGDATA, "%ld", (long)getpid());  //getpid()取得目前进程的进程识别码,通过格式化字符复制操作,复制给mesg.mesg_data
	len = strlen(mesg.mesg_data);
	ptr = mesg.mesg_data + len;
	fgets(ptr, MAXMESGDATA - len, stdin); /* 读入路径名 */		//由前句可知,将路径名读入,加到mesg_data之后
	len = strlen(mesg.mesg_data);
	if (mesg.mesg_data[len-1] == '\n')    //通过判断得到数据实际的长度(不包括换行符\n)
		len--;
	mesg.mesg_len = len;
	mesg.mesg_type = 1;
	msg_send(msgid, &mesg);				/* 将路径名写入消息队列 */		//
	mesg.mesg_type = getpid();			/* 以自己的进程号做为消息类型 */
	while((n = mesg_recv(msgid, &mesg)) > 0)		/* 从消息队列中读回服务进程返回的消息*/
		write(stdout, mesg.mesg_data);	/* 将获得的文件内容写到标准输出 */
	exit(0);
}

⌨️ 快捷键说明

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