【C语言】进程之间的通信编程练习题(更新ing)

第一题:现在有2个.c 文件 1.c负责输入2个非0数,a 和 b 2.c负责找出 a 到 b 之间的所有质数 要求使用无名管道实现 第二题:创建一对父子 父进程负责输入一串字符串 子进程负责判断这串字符串是否为回文字符串

1.c文件: 

#include<myheadIO.h>
int main(int argc, const char *argv[])
{
	int arr[2];
	int res=pipe(arr);
	if(res==-1)
	{
		perror("pipe");
		return 1;
	}
	res=fork();
	if(res>0)
	{
		close(arr[0]);
		int a=0,b=0;
		printf("请输入非0数a:");
		scanf("%d",&a);
		printf("请输入非0数b:");
		scanf("%d",&b);
		write(arr[1],&a,8);
		write(arr[1],&b,8);
	}else
	{
		char arr0[16]={0};
		char arr1[16]={0};
		sprintf(arr0,"%d",arr[0]);
		sprintf(arr1,"%d",arr[1]);
		execl("./11","11",arr0,arr1,NULL);
	}
	return 0;
}

11.c文件: 

#include<myheadIO.h>

//判断一个数是否为质数的函数
int isZhi(int a)
{
	for(int i=2;i<a;i++)
	{
		if(a%i==0)
		{
			return 0;
		}
	}
	return 1;
}

int main(int argc, const char *argv[])
{
	int rfd=atoi(argv[1]);
	int wfd=atoi(argv[2]);
	close(wfd);
	int a=0,b=0;
	read(rfd,&a,8);
	read(rfd,&b,8);
	//printf("%d %d\n",a,b);
	printf("a到b之间的所有质数:");
	for(int i=a;i<=b;i++)
	{
		if(isZhi(i))
		{
			printf("%d ",i);
		}
	}
	putchar(10);
	
	return 0;
}

 要编译11.c文件生成11可执行文件之后再运行1.c生产的可执行文件即可达到效果:

 

 第二题:创建一对父子 父进程负责输入一串字符串 子进程负责判断这串字符串是否为回文字符串

#include<myheadIO.h>
#include<string.h>
int main(int argc, const char *argv[])
{
	int arr[2];
	int res=pipe(arr);
	if(res==-1)
	{
		perror("pipe");
		return 1;
	}
	res=fork();
	if(res>0)
	{
		close(arr[0]);
		char buf[64];
		while(1)
		{
			scanf("%s",buf);
			//printf("%s",buf);
			//printf("%ld",strlen(buf));
			write(arr[1],buf,sizeof(buf));
			usleep(1000);
		}
	}else if(res==0)
	{
		close(arr[1]);
		char buf[64];
		while(1)
		{
			int i=0,j=0;
			read(arr[0],buf,sizeof(buf));
			int len=strlen(buf);
			for(i=0,j=len-1;i<j;i++,j--)
			{
				if(buf[i]!=buf[j])
				{
					printf("字符串\"%s\"不是回文字符\n",buf);
					break;
				}
			}
			if(i>=j)
			{
				printf("字符串\"%s\"是回文字符\n",buf);
			}
		}
	}
	return 0;
}

第三题:创建一对父子进程,父进程循环输出A,子进程循环输出a,使用信号灯集同步这对父子进程,实现效果A_a_A_a_A_a······_表示休眠一秒

#include<myheadIO.h>

void semwait(int id,int index)
{
	struct sembuf buf={index,-1,SEM_UNDO};
	semop(id,&buf,1);
}
void sempost(int id,int index)
{
	struct sembuf buf={index,1,SEM_UNDO};
	semop(id,&buf,1);
}
int main(int argc, const char *argv[])
{
	//ipc_t2
	int fd=open("./ipc_tt2",O_EXCL|O_CREAT,0666);
	if(fd!=-1)
	{
		close(fd);
	}
	key_t key=ftok("./ipc",3);
	int semid=semget(key,1,IPC_CREAT|0666);
	semctl(semid,0,SETVAL,0);
	semctl(semid,1,SETVAL,1);
	int pid=fork();
	if(pid>0)
	{
		while(1)
		{
			semwait(semid,1);
			printf("A_");
			fflush(stdout);
			sleep(1);
			sempost(semid,0);
		}
	}else if(pid==0)
	{
		while(1)
		{
			semwait(semid,0);
			printf("a_");
			fflush(stdout);
			sleep(1);
			sempost(semid,1);
		}
	}
	return 0;
}

第四题:使用消息队列+信号集实现2个终端之间的相互聊天功能

 终端1代码文件

#include<myheadIO.h>
#include<string.h>
typedef struct msgbuf
{
	long type;
	char text[99];
}msg;

//信号灯集的加减操作封装
void semwait(int id,int index)
{
	struct sembuf buf={index,-1,SEM_UNDO};
	semop(id,&buf,1);
}
void sempost(int id,int index)
{
	struct sembuf buf={index,1,SEM_UNDO};
	semop(id,&buf,1);
}

void handler(int signum)
{
	key_t key=ftok("./ipc",1);
	if(key==-1)
	{
		perror("ftok");
	}
	int msgid=msgget(key,IPC_CREAT|0666);
	if(msgid==-1)
	{
		perror("msgid");
	}
	msgctl(msgid,IPC_RMID,0);
	exit(0);
}

void* read_fun()
{
	//信号灯集的创建
	key_t sem_key=ftok("./ipc",3);
	int sem_id=semget(sem_key,2,IPC_CREAT|0666);
	semctl(sem_id,0,SETVAL,0);

	key_t key=ftok("./ipc",2);
	if(key==-1)
	{
		perror("ftok");
		return NULL;
	}
	int msgid=msgget(key,IPC_CREAT|0666);
	if(msgid==-1)
	{
		perror("msgget");
		return NULL;
	}
	while(1)
	{
		semwait(sem_id,1);
		msg buf={0};
		//buf.type=2;
		msgrcv(msgid,&buf,sizeof(buf.text),2,0);
		printf("\b\b\b\b\b终端二的消息:%s\n",buf.text);
	}
}

int main(int argc, const char *argv[])
{
	signal(SIGINT,handler);
	int fd=open("./ipc",O_EXCL|O_CREAT,0666);
	if(fd!=-1)
	{
		close(fd);
	}

	int pid=fork();
	if(pid>0)
	{
		//信号灯集的创建
		key_t sem_key=ftok("./ipc",3);
		if(sem_key==-1)
		{
			perror("sem_key");
			return 1;
		}
		int sem_id=semget(sem_key,2,IPC_CREAT|0666);
		if(sem_id==-1)
		{
			perror("sem_id");
			return 1;
		}
		semctl(sem_id,0,SETVAL,0);

		//消息队列的创建
		key_t key=ftok("./ipc",1);
		if(key==-1)
		{
			perror("ftok");
			return 1;
		}
		int msgid=msgget(key,IPC_CREAT|0666);
		if(msgid==-1)
		{
			perror("msgid");
			return 1;
		}
		//msgctl(msgid,IPC_RMID,0);

		while(1)
		{
			msg buf1={0};
			buf1.type=1;
			printf("终端一发送:");
			fflush(stdout);
			scanf("%s",buf1.text);
			while(getchar()!='\n');
			msgsnd(msgid,&buf1,strlen(buf1.text),0);
			sempost(sem_id,0);
		}
	}else if(pid==0)
	{
		read_fun();
	}

	return 0;
}

终端2代码文件

#include<myheadIO.h>
#include<string.h>
typedef struct msgbuf
{
	long type;
	char text[99];
}msg;

//信号灯集的加减操作封装
void semwait(int id,int index)
{
	struct sembuf buf={index,-1,SEM_UNDO};
	semop(id,&buf,1);
}
void sempost(int id,int index)
{
	struct sembuf buf={index,1,SEM_UNDO};
	semop(id,&buf,1);
}

void* read_fun()
{
	key_t sem_key=ftok("./ipc",3);
	int sem_id=semget(sem_key,2,IPC_CREAT|0666);
	semctl(sem_id,0,SETVAL,0);

	key_t key=ftok("./ipc",1);
	if(key==-1)
	{
		perror("ftok");
		return NULL;
	}
	int msgid=msgget(key,IPC_CREAT|0666);
	if(msgid==-1)
	{
		perror("msgget");
		return NULL;
	}
	while(1)
	{
		semwait(sem_id,0);
		msg buf={0};
		//buf.type=1;
		msgrcv(msgid,&buf,sizeof(buf.text),1,0);
		printf("\b\b\b\b\b\b终端一的消息:%s\n",buf.text);
	}
}

void handler(int signum)
{
	key_t key=ftok("./ipc",2);
	if(key==-1)
	{
		perror("ftok");
	}
	int msgid=msgget(key,IPC_CREAT|0666);
	if(msgid==-1)
	{
		perror("msgid");
	}
	msgctl(msgid,IPC_RMID,0);
	exit(0);
}

int main(int argc, const char *argv[])
{
	signal(SIGINT,handler);
	int fd=open("./ipc",O_EXCL|O_CREAT,0666);
	if(fd!=-1)
	{
		close(fd);
	}
	int pid=fork();
	if(pid>0)
	{
		key_t sem_key=ftok("./ipc",3);
		int sem_id=semget(sem_key,2,IPC_CREAT|0666);
		semctl(sem_id,0,SETVAL,0);
		key_t key=ftok("./ipc",2);
		if(key==-1)
		{
			perror("ftok");
			return 1;
		}
		int msgid=msgget(key,IPC_CREAT|0666);
		if(msgid==-1)
		{
			perror("msgid");
			return 1;
		}
		//msgctl(msgid,IPC_RMID,0);
		while(1)
		{
			msg buf2={0};
			buf2.type=2;
			printf("终端二发送:");
			fflush(stdout);
			scanf("%s",buf2.text);
			while(getchar()!='\n');
			msgsnd(msgid,&buf2,strlen(buf2.text),IPC_NOWAIT);
			sempost(sem_id,1);
		}
	}else if(pid==0)
	{
		read_fun();
	}
	return 0;

}

运行结果:和预计效果差点儿,脑袋想破了,有没有人知道接受完消息怎么把输出提示语显示出来,麻烦评论告诉我,谢谢啦~还有这个\b和中文的规则是什么啊???·。·??

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值