IO / day07 作业

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

代码

#include <myhead.h>

//define a msg struct type
struct msgbuf
{
	long mtype; //消息类型
	char mtext[1024]; //消息正文大小

};

//macro msg size
#define SIZE (sizeof(struct msgbuf)-sizeof(long))

int recv(int mtype_recv)
{
	//*-----snd-----	

	//1. create key
	key_t key = ftok("/", 'k');
	if(key==-1)
	{
		perror("error");
		return -1;
	}

	printf("key=%#x\n", key);
	
	//2. create msg queue
	int msgid = msgget(key, IPC_CREAT | 0664);
	if(msgid == -1)
	{
		perror("msgget error");
		return -1;
	}

	printf("msgid=%d\n", msgid);


	//3. send msg to msg queue
	//define a msg var
	struct msgbuf buf;

	while(1)
	{

		//将消息从消息队列读取
		msgrcv(msgid, &buf, SIZE, mtype_recv, 0 );
		//param1: msg queue id
		//param2; buffer start address
		//param3: msg text size
		//param4: msg type
		//param5: if block, 0--> block; 

		printf("recv msg=%s\n", buf.mtext);

		//
		if(strcmp(buf.mtext, "quit") == 0)
		{
			break;
			
		}
	}

	//4. delete msg queue
      if ((msgctl(msgid, IPC_RMID, NULL)) == -1)
      {
          perror("msgctl error");
          return -1;
      }  

}

void* task_recv(void* arg)
{
	int *pmtype_recv = (int *)arg;
	recv(*pmtype_recv);
}




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

	int mtype_snd = 0;
	int mtype_recv = 0;

	printf("plesae input msg type for sender:\n>");
	scanf("%d", &mtype_snd );

	printf("plesae input msg type for receiver:\n>");
	scanf("%d", &mtype_recv );

	int *pmtype_recv = &mtype_recv;


	pthread_t tid = -1;
	int res = pthread_create(&tid, NULL, task_recv, (void *)pmtype_recv );
	if(res !=0 )
	{
		printf("thread create error\n");
		return -1;
	}

	//*-----snd-----	

	//1. create key
	key_t key = ftok("/", 'k');
	if(key==-1)
	{
		perror("error");
		return -1;
	}

	printf("key=%#x\n", key);
	
	//2. create msg queue
	int msgid = msgget(key, IPC_CREAT | 0664);
	if(msgid == -1)
	{
		perror("msgget error");
		return -1;
	}

	printf("msgid=%d\n", msgid);


	//3. send msg to msg queue
	//define a msg var
	struct msgbuf buf;
	buf.mtype = mtype_snd;

	while(1)
	{

		printf("please input msg to send:");
		scanf("%s", buf.mtext);

		//将消息从消息队列读取
		msgsnd(msgid, &buf, SIZE, 0 );
		//param1: msg queue id
		//param2; buffer start address
		//param3: msg text
		//param4: if block, 0--> block; 
		printf("recv msg=%s\n", buf.mtext);

		//
		if(strcmp(buf.mtext, "quit") == 0)
		{
			break;
			
		}
	}

	//4. delete msg queue
      if ((msgctl(msgid, IPC_RMID, NULL)) == -1)
      {
          perror("msgctl error");
          return -1;
      }    	
	return 0;
}

运行结果

2. 思维导图

以下是Java代码实现: ```java import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class CreateFiles { public static void main(String[] args) throws IOException { String basePath = "./day19/task02"; List<Map<String, String>> fileList = new ArrayList<>(); Map<String, String> file1 = new HashMap<>(); file1.put("name", "File类操作.avi"); file1.put("path", "./day19/task02/test01"); fileList.add(file1); Map<String, String> file2 = new HashMap<>(); file2.put("name", "File学习笔记.md"); file2.put("path", "./day19/task02/test01"); fileList.add(file2); Map<String, String> file3 = new HashMap<>(); file3.put("name", "任务作业.txt"); file3.put("path", "./day19/task02/test01"); fileList.add(file3); Map<String, String> file4 = new HashMap<>(); file4.put("name", "java学院-讲师上云-日期讲解.avi"); file4.put("path", "./day19/task02/test02"); fileList.add(file4); Map<String, String> file5 = new HashMap<>(); file5.put("name", "java学院-讲师上云-日期解析.avi"); file5.put("path", "./day19/task02/test02"); fileList.add(file5); Map<String, String> dir1 = new HashMap<>(); dir1.put("name", "test01"); dir1.put("path", "./day19/task02"); fileList.add(dir1); Map<String, String> dir2 = new HashMap<>(); dir2.put("name", "test02"); dir2.put("path", "./day19/task02"); fileList.add(dir2); Map<String, String> dir3 = new HashMap<>(); dir3.put("name", "task02"); dir3.put("path", "./day19"); fileList.add(dir3); for (Map<String, String> file : fileList) { String name = file.get("name"); String path = file.get("path"); File dir = new File(path); if (!dir.exists()) { dir.mkdirs(); } if (!name.contains(".")) { File subDir = new File(dir, name); subDir.mkdir(); } else { File subFile = new File(dir, name); subFile.createNewFile(); } } } } ``` 首先定义了一个basePath,即根目录的路径。然后创建了一个List,用于存储所有的文件和文件夹。 接下来添加了七个元素,其中五个是文件,两个是文件夹。每个元素都是以Map形式存储的,包含了元素的名称和路径。 接下来使用循环遍历所有的元素,先判断元素对应的目录是否存在,不存在则递归创建。然后判断元素是文件还是文件夹,如果是文件则创建文件,如果是文件夹则创建文件夹。 最终,执行代码后会在day19目录下创建task02目录,并在其中创建test01和test02两个子目录,以及相应的文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值