2022.11.05work

1.一个进程循环打印字符串,另外一个进程循环倒置字符串;
要求打印一次,倒置一次

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

int main(int argc, const char *argv[])
{

	key_t semkey = ftok("./",0);
	if(semkey==EOF){
		perror("ftok");
		return 0;
	}
	
	
	// 创建共享内存
	int shmid=shmget(semkey,100,IPC_CREAT|0777);
	char *s;
	shmat(shmid,s,0);
	bzero(s,100);
	strcpy(s,"asdfghjkl");

	int semid=semget(semkey,1,IPC_CREAT|0777);
	if(EOF==semid){
		perror("semget"); 
		return 0;
	}


	pid_t cpid=fork();
	struct sembuf sems;
	sems.sem_num=semid;
	sems.sem_flg=0;
	if(cpid){
		int val;
		// 显示
		while(1){
			sems.sem_op=0;
			semop(semid,&sems,1);
			
			printf("%s\n",s);
			
			sems.sem_op=2;
			semop(semid,&sems,1);
		}
	}else{
		// 倒置
		char *lp,*rp;
			while(1){
				
				sems.sem_op=-1;
				semop(semid,&sems,1);
				printf("11111\n");	
				lp=s;rp=s;
				while(*++rp);
				rp--;
				while(lp<rp){
					*lp+=*rp;
					*rp=*lp-*rp;
					*lp-=*rp;
					lp++;
					rp--;
				}
				
				sems.sem_op=-1;
				semop(semid,&sems,1);
				
			}
	}


	return 0;
}

 

 

2. 要求用消息队列实现AB进程对话:

1)A进程发送一句话,B进程接收后打印;
2)B进程接着再发送一句话,A进程接收打印;
3)重复上述步骤,当A进程或者B进程接收到quit后退出AB进程。
在第二题的基础上实现AB进程能够随时收发。

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

struct msgp
{
	long mtype;
	char mtext[100];
};

int main(int argc, const char *argv[])
{
	int msgkey=ftok("./",1);
	if(EOF==msgkey){
		perror("ftok");
		return 0;
	}

	int msgid=msgget(msgkey,IPC_CREAT|0777);
	
	pid_t cpid=fork();
	if(cpid){
		// 发送
		struct msgp sendp;
		sendp.mtype=1;                  // 另一端发送2包
		while(1){
			bzero(sendp.mtext,100);
			scanf(" %s",sendp.mtext);
			if(msgsnd(msgid,&sendp,100,0)){
				perror("msgsnd");
				return 0;
			}
		}
	}else{
		// 接受
		struct msgp recvp;
		recvp.mtype=2;
		while(1){
			bzero(recvp.mtext,100);
			msgrcv(msgid,&recvp,100,2,0); // 另一端接收1包
			printf("B:%s\n",recvp.mtext);
		}

	}
	return 0;
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值