IO线程进程(共享内存)

该代码示例展示了两个C程序如何使用共享内存进行通信,其中一个进程逆转数组并设置标志,另一个进程读取并显示逆转后的数组,然后重置标志。关键函数包括ftok用于生成键值,shmget创建共享内存,shmat和shmdt分别用于附加和分离共享内存,以及shmctl删除共享内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、

 逆转的进程

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


int main(int argc, const char *argv[])
{
	key_t key=ftok("./",1);
	if(key<0){
		perror("ftok");
		return -1;
	}
	//printf("key=%#x\n",key);
/*	int msqid=msgget(key,IPC_CREAT|0664);{{{
	if(msqid<0){
		perror("msgget");
		return -1;
	}
	printf("msqid=%d\n",msqid);
	system("ipcs -q");*//*}}}*/
	int shmid=shmget(key,32,IPC_CREAT|0664);
	
	if(shmid<0){
		perror("shmget");
		return -1;
	}
	void * shmaddr=shmat(shmid,NULL,0);
	if((void*)-1==shmaddr){
		perror("shmaddr");
		return -1;
	}
	
	int buf[7]={1,2,3,4,5,6,7};
	int *p=(int*)shmaddr;

	int *flag=(int *)shmaddr+7;
	*flag=0;
	int i=0;


	for(i=0;i<7;i++){
		p[i]=buf[i];
	}
	while(1){
		if(*flag==0){
			int temp=0;
			int *start=p;
			int *end=p+6;
			while(start<end){
				temp=*start;
				*start=*end;
				*end=temp; 
				start++;
				end--;
				
			}
			
	*flag=1;
		}
	}
	if(shmdt(shmaddr)<0){
		perror("shmdt");
		return -1;
	}
	system("ipcs -m");
	return 0;
}

输出的进程

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <string.h>
#include <sys/shm.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
	key_t key=ftok("./",1);
	if(key<0){
		perror("ftok");
		return -1;
	}
//	printf("key=%#x\n",key);
/*	int msqid=msgget(key,IPC_CREAT|0664);{{{
	if(msqid<0){
		perror("msgget");
		return -1;
	}
	printf("msqid=%d\n",msqid);
	system("ipcs -q");*//*}}}*/
	int shmid=shmget(key,32,IPC_CREAT|0664);
	
	if(shmid<0){
		perror("shmget");
		return -1;
	}
	void * shmaddr=shmat(shmid,NULL,0);
	if((void*)-1==shmaddr){
		perror("shmaddr");
		return -1;
	}
	
	int buf[7]={1,2,3,4,5,6,7};
	int *p=(int*)shmaddr;
	int *flag=(int *)shmaddr+7;
	int i=0;
	while(1){
		for(i=0;i<7;i++){
			if(*flag==1){
				
				printf("%d",*(p+i));
			}
		}
	*flag=0;
	
		puts("");
		sleep(1);
	}
	if(shmdt(shmaddr)<0){
		perror("shmdt");
		return -1;
	}
	shmctl(shmid,IPC_RMID,NULL);
	system("ipcs -m");
	return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值