7.24IO

思维导图

1.使用消息队列实现2个终端之间的互相聊天功能

typedef struct msgbuf{ 
	long mtype; 
	char mtext[255];
}msg_t;
int main(int argc,const char *argv[])
{
	int fd =open("./ipc",O_EXCL|O_CREAT,0666);
	if(fd!=-1){
 	close(fd);
	}
	//创建密钥
	//第二个参数非0即可,8bit位,1~255.
	key_t key=ftok("./ipc",1);
 	if(key==-1){
 		perror("ftok");
 		return 1;
 	}
 	//根据密钥访问消息队列,获取队列d
	//参数二,一般写IPCCREATI0666表示如果队列不在,则以666的权限创建该消息队列 
	int id =msgget(key,IPC_CREAT|0566);
 	if(id=-1){
 		perror("msgget");
 		return 1;
 	}
 	int res =fork();
 	//读写该消息队列
	if(res>0){
 		while(1){
 			msg_t buf;
 			buf.mtype=1;
 			printf("请输入:");
 			scanf("%s",buf.mtext);
 			while(getchar()!=10);
 			//向消息对列传输数据
			msgsnd(id,&buf,strlen(buf.mtext),0);
 			usleep(1000);
 		}
 	}else if(res==0){
		while(1){
			msg_t buf;
			msgrcv(id,&buf,sizeof (buf.mtext),2,0);
		 	printf("接受到2队列到消息为:%s\n",buf.mtext);
		}
 	}
	 return 0;
}
typedef struct msgbuf{
 	long mtype;
 	char mtext[256];
}msg_t;
int main(int argc,const char *argv[])
{
	int fd=open("./ipc",O_EXCL | O_CREAT,0666);
	if(fd=1){
 		close(fd);
	}
 	key_t key=ftok("./ipc",1);
 	if(key==-1){
 		perror("ftok");
 		return 1;
 	}
 	int id =msgget(key,IPC_CREAT|0666);
	if(id==-1){
 		perror("msgget");
 		return 1;
 	}
 	int res=fork();
 	if(res>0){
 		while(1){
 			msg_t buf;
 			buf.mtype=2;
 			printf("请输入:");
 			scanf("%s" ,buf.mtext);
 			while(getchar()!=10);
			msgsnd(id,&buf,strlen(buf.mtext),0);
 			usleep(1000);
		}
 	}else if (res ==0){
 		while(1){
			msg_t buf;
			msgrcv(id,&buf,sizeof(buf.mtext),1,0);
 			printf("接受到1队列的消息为:%s\n",buf.mtext);
		}
	}
 	return 0;
}

2.创建一对父子进程,父进程循环输出 A,子进程循环输出a 使用信号灯集同步这对父子进程,实现效果 A_a_A_a ..... _表示休眠1秒

void sempost(int id,int n){
    struct sembuf buf = {0};
    buf.sem_num = n;
    buf.sem_op = 1;
    buf.sem_flg = SEM_UNDO;
    semop(id,&buf,1);
}

void semwait(int id,int n){
    struct sembuf buf = {0};
    buf.sem_num = n;
    buf.sem_op = -1;
    buf.sem_flg = SEM_UNDO;
    semop(id,&buf,1);
}

int main(int argc, const char *argv[])
{
    key_t key = ftok("./ipc",1);
         // 创建一个信号灯集,里面有2个信号量                   
    int id = semget(key,2,IPC_CREAT | 0666);
         // 初始化第0个信号量,值为0
    semctl(id,0,SETVAL,0);
         // 初始化第1个信号量,值为1
    semctl(id,1,SETVAL,1);
    int res = fork();
    if(res > 0){
        while(1){
                      // 让第1个信号量 -1
            semwait(id,1);
            printf("A\n");
            sleep(1);
                       // 让第0个信号量 +1
            sempost(id,0);
        }
    }else if(res == 0){
        while(1){
                          // 让第0个信号量 -1
            semwait(id,0);
            printf("a\n");
            sleep(1);
                           // 让第1个信号量+1
            sempost(id,1);
        }
    }
    return 0;
}

3.使用共享内存 + 信号灯集实现2个终端之间互相聊天

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值