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

📄 example25.c

📁 LinuxNetProgramming Linux网络编程基础实例
💻 C
字号:
#include	<stdio.h>

#include	<sys/msg.h>

#include	<sys/ipc.h>

#include	<sys/types.h>

#include 	<errno.h>

#include	<string.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, struct mymesg *);

size_t   mesg_recv(int id, struct mymesg *mptr);

int

main()

{

	int	msgid;

	FILE	*fp;

	char	*ptr;

	pid_t	pid;

	ssize_t	n;

	struct mymesg mesg;



	msgid = msgget(1234, SVMSG_MODE | IPC_CREAT); /*、以1234为key创建一个消息队列 */



	for( ; ; ) {	/*循环从消息队列中读取客户请求 */

		mesg.mesg_type = 1;

		if ((n = mesg_recv(msgid, &mesg)) == 0) {

			printf("pathname missing");

			continue;

		}

		mesg.mesg_data[n] = '\0';	/*将消息的数据段格式化成以空字符结束的字符串 */

		if ((ptr = strchr(mesg.mesg_data, ' ')) == NULL) {

			printf("bogus request: %s", mesg.mesg_data);

			continue;

		}

		*ptr++ = 0;

		pid = atol(mesg.mesg_data); /*获得发送消息的客户进程的进程号 */

		mesg.mesg_type = pid;	

		if ((fp = fopen(ptr, "r")) == NULL) { /*打开所请求文件来读 */

			snprintf(mesg.mesg_data + n, sizeof(mesg.mesg_data) -n, ":can't open, %s\n", strerror(errno));

			mesg.mesg_len = strlen(ptr);

			memmove(mesg.mesg_data, ptr, mesg.mesg_len);

			msg_send(msgid, &mesg);	/*将文件内容写回消息队列 */

		}

		else {	/*若文件不存在,则将客户的请求消息内容再写回消息队列 */

			while(fgets(mesg.mesg_data, MAXMESGDATA, fp) != NULL) {

				mesg.mesg_len = strlen(mesg.mesg_data);

				msg_send(msgid, &mesg);

			}

			fclose(fp);

		}

		mesg.mesg_len = 0;

		msg_send(msgid, &mesg);

	}

	exit(0);

}



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 */

}

⌨️ 快捷键说明

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