IO进程线程Day7

发布时间:2024年01月10日

1> 使用消息队列完成两个进程之间相互通信

#include<myhead.h>
struct msgbuf
{
	long mtype;
	char mtext[1024];
};
#define SIZE (sizeof(struct msgbuf)-sizeof(long))
 
int main(int argc, const char *argv[])
{
	//创建key值
	key_t key=0;
	if((key=ftok("/",'t'))==-1)
	{
		perror("fork error");
		return -1;
	}
	printf("key=%#x\n",key);
	//创建消息队列
	int msqid=0;
	msqid=msgget(key,IPC_CREAT|0664);
	if(msqid==-1)
	{
		perror("msgget error");
		return -1;
	}
 
	printf("msqid=%d\n",msqid);
	//定义一个容器
	struct msgbuf buf={.mtype=100};
	//向容器写入数据
	while(1)
	{
		printf("请输入要存放的数据:");
		scanf("%s",buf.mtext);
		getchar();
		//将消息存放到消息队列中
		msgsnd(msqid,&buf,SIZE,0);
		printf("发送成功\n");
		if(strcmp(buf.mtext,"quit")==0)
		{
			break;
		}
	}
 
 
	return 0;
}
 
#include<myhead.h>
 
//定义消息结构体类型
struct msgbuf
{
    long mtype;         //消息类型
    char mtext[1024];       //消息正文
 
};
 
//定义一个宏,表示正文大小
#define SIZE (sizeof(struct msgbuf) - sizeof(long))
 
 
int main(int argc, const char *argv[])
{
    //1、创建key值
    key_t key = 0;
    if((key = ftok("/", 't')) == -1)
    {
        perror("fork error");
        return -1;
    }
 
    printf("key = %#x\n", key);
 
    //2、使用key值创建一个消息队列
    int msqid = 0;
    if((msqid=msgget(key, IPC_CREAT|0664)) == -1)
    {
        perror("msgget error");
        return -1;
    }
 
    printf("msqid = %d\n", msqid);
 
    //定义一个消息类型的容器
    struct msgbuf buf;
 
    //3、循环向消息队列中存放数据
    while(1)
    {
        //从消息队列中读取消息
        msgrcv(msqid, &buf, SIZE, 0, 0);
        //第一个0表示无视类型,每次都取第一个消息
        //第二个0表示阻塞形式接收消息
 
        printf("收到消息为:%s\n", buf.mtext);
 
        if(strcmp(buf.mtext, "quit") == 0)
        {
            break;
        }
    }
 
    //4、删除消息队列
    if(msgctl(msqid, IPC_RMID, NULL) == -1)
    {
        perror("msgctl error");
        return -1;
    }
 
 
    return 0;
}

2> 将信号通信相关代码重新实现一遍

#include<myhead.h>
 
//定义信号处理函数
void handler(int signo)
{
    if(signo == SIGUSR1)
    {
        printf("end1\n");
 
        raise(SIGKILL);     //自杀
    }
}
 
 
int main(int argc, const char *argv[])
{
    
    //定义进程号
    pid_t pid = fork();
 
    if(pid > 0)
    {
        //父进程
 
        //将SIGUSR1信号绑定
        if(signal(SIGUSR1, handler) == SIG_ERR)
        {
            perror("signal error");
            return -1;
        }
        
        while(1)
        {
            printf("continue\n");
            sleep(1);
        }
 
    }else if(pid == 0)
    {
        //子进程
        printf("111111\n");
 
        sleep(3);
 
        printf("end\n");
 
        //向父进程发送一个信号
        kill(getppid(), SIGUSR1);
 
        exit(EXIT_SUCCESS);        //退出进程
 
 
    }else
    {
        perror("fork error");
        return -1;
    }
 
 
    return 0;
}

3> 将共享内存相关代码重新实现一遍

#include<myhead.h>
#define PAGE_SIZE 4096
 
int main(int argc, const char *argv[])
{
	//创建key
	key_t key=-1;
	key=ftok("/",'t');
	if(key==-1)
	{ 	
		perror("ftok error");
		return -1;
	}
	printf("key=%#x",key);
	//创建共享内存
	int shmid=0;
	shmid=shmget(key,PAGE_SIZE,IPC_CREAT|0664);
	if(shmid==-1)
	{
		perror("shmget error");
		return -1;
	}
	printf("shmid=%#x",shmid);
	
	//共享内存段地址映射到用户空间
	char *addr=(char*)shmat(shmid,NULL,0);
	if(addr == (void *)-1)
    {
        perror("shmat error");
        return -1;
    }
	//4、操作共享内存
    while(1)
    {
        fgets(addr, PAGE_SIZE, stdin);   //从终端输入数据
        //addr[strlen(addr) - 1] 等价与*(addr+strlen(addr)-1)
		addr[strlen(addr) - 1] = '\0';    //将换行换成'\0'
		
        if(strcmp(addr, "quit") == 0)
        {
            break;
        }
    }
 
 
	return 0;
}
#include<myhead.h>
#define PAGE_SIZE 4096
 
int main(int argc, const char *argv[])
{
    //1、创建key值
    key_t key = -1;
    if((key = ftok("/", 't')) == -1)
    {
        perror("ftok error");
        return -1;
    }
    printf("key = %#x\n", key);
 
    //2、将物理内存创建出共享内存段
    int shmid = 0;
    if((shmid = shmget(key, PAGE_SIZE, IPC_CREAT|0664)) == -1)
    {
        perror("shmget error");
        return -1;
    }
    printf("shmid = %d\n", shmid);
 
    //3、将共享内存段地址映射到用户空间
    char *addr = (char *)shmat(shmid, NULL, 0);
    if(addr == (void *)-1)
    {
        perror("shmat error");
        return -1;
    }
    printf("addr = %p\n", addr);
    
    //4、操作共享内存
    while(1)
    {
    
        printf("共享内存中的数据为:%s\n", addr);
        sleep(1);
 
        if(strcmp(addr, "quit") == 0)
        {
            break;
        }
    }
 
    
    //5、取消映射
    if(shmdt(addr) == -1)
    {
        perror("shmdt error");
        return -1;
    }
 
 
    //6、删除共享内存
    if(shmctl(shmid, IPC_RMID, NULL) == -1)
    {
        perror("shmctl error");
        return -1;
    }
 
    return 0;
}

文章来源:https://blog.csdn.net/weixin_45585727/article/details/135493899
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。