进程之间的通信

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

#define MSGKEY 1234

struct msgbuf {
long mtype; /* message type, must be > 0 /
char mtext[128]; /
message data */
};

int main()
{
int msgid, ret;
struct msgbuf m;
pid_t pid;

msgid = msgget(MSGKEY, 0);  //获取消息队列
if (-1 == msgid)
{
	perror("msgget");
	exit(1);
}

pid = fork();
if (-1 == pid)
{
	perror("fork");
	exit(1);
}
else if (0 == pid)   //子进程发送
{
	while (1)
	{
		scanf("%s", m.mtext);
		m.mtype = 1;
		ret = msgsnd(msgid, &m, sizeof(m.mtext), 0);
		if (-1 == ret)
		{
			perror("msgsnd");
		}
		if (!strcmp(m.mtext, "bye"))
		{
			m.mtype = 2;
			msgsnd(msgid, &m, sizeof(m.mtext), 0);
			break;
		}

		bzero(m.mtext, sizeof(m.mtext));
	}
}
else   //父进程接收
{
	while (1)
	{
		ret = msgrcv(msgid, &m, sizeof(m.mtext), 2, 0);
		if (-1 == ret)
		{
			perror("msgrcv");
		}
		if (!strcmp(m.mtext, "bye"))
		{
			kill(pid, 9);
			break;
		}

		printf("\t\t%s\n", m.mtext);
		bzero(m.mtext, sizeof(m.mtext));
	}
	int status;
	wait(&status);
}

return 0;

}

#include <unistd.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main()
{
int ret, fd[2] = {0};
pid_t pid;
char buf[32] = {0};

ret = pipe(fd);      //创建无名管道
if (-1 == ret)
{
	perror("pipe");
	exit(1);
}

pid = fork();
if (-1 == pid)
{
	perror("fork");
	exit(1);
}
else if (0 == pid)
{
	while (1)
	{
		scanf("%s", buf);
		ret = write(fd[1], buf, strlen(buf));   //写管道 fd[1]
		if (-1 == ret)
		{
			perror("write");
		}
		if (!strcmp(buf, "bye"))   //输入关键字bye 退出循环
		{
			break;
		}
		memset(buf, 0, sizeof(buf));
	}
}
else     //父进程,读管道
{
	while (1)
	{
		ret = read(fd[0], buf, sizeof(buf));   //fd[0]用于读管道
		if (-1 == ret)
		{
			perror("read");
		}
		if (!strcmp(buf, "bye"))
		{
			break;
		}
		printf("\t\t\t%s\n", buf);
		memset(buf, 0, sizeof(buf));
	}

	int status;
	waitpid(pid, &status, 0);
}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值