目录
1.作业一
// 要求实现AB进程对话
// A进程先发送一句话给B进程,B进程接收后打印
// B进程再回复一句话给A进程,A进程接收后打印
// 重复1.2步骤,当收到quit后,要结束AB进程
// 提示:用一个消息队列,两种类型即可
// 当对方输入quit后,退出AB进程删除消息队列;
A.c
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <unistd.h>
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[128]; /* message data */
};
// 回调函数,用于接收消息
void* task(void* arg)
{
// 获取参数
int msqid = *(int*)arg;
// 4.定义消息包
struct msgbuf msg_data;
// 获取消息
while (msgrcv(msqid, &msg_data, sizeof(msg_data.mtext), 200, 0)) {
if (strcasecmp(msg_data.mtext, "quit") == 0) {
break;
}
printf("B: %s\n", msg_data.mtext);
}
// 退出进程
_exit(0);
}
int main(int argc, const char* argv[])
{
// 1.创建key
key_t key = ftok("/home/liu", 45);
if (-1 == key) {
perror("ftok");
return -1;
}
// 2.创建消息队列
int msqid = msgget(key, IPC_CREAT | 0664);
if (-1 == msqid) {
perror("msgget");
return -1;
}
// 3.创建线程, 用于获取消息
pthread_t tid;
if (0 != pthread_create(&tid, NULL, task, &msqid)) {
printf("pthread_create error\n");
return -1;
}
// 4.标记线程分离
// pthread_cancel(tid);
// 5.定义消息包
struct msgbuf msg_data;
// 设置消息类型
msg_data.mtype = 100;
// 6.向消息队列中发消息
while (1) {
// 输入消息数据
// printf("请输入消息数据:");
scanf("%s", msg_data.mtext);
getchar();
// 发消息
msgsnd(msqid, &msg_data, sizeof(msg_data.mtext), IPC_NOWAIT);
// 判断是否退出
if (strcasecmp(msg_data.mtext, "quit") == 0) {
break;
}
}
// 删除消息队列
msgctl(msqid, IPC_RMID, NULL);
return 0;
}
B.c
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <unistd.h>
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[128]; /* message data */
};
// 回调函数,用于接收消息
void* task(void* arg)
{
// 获取参数
int msqid = *(int*)arg;
// 4.定义消息包
struct msgbuf msg_data;
// 获取消息
while (msgrcv(msqid, &msg_data, sizeof(msg_data.mtext), 100, 0)) {
if (strcasecmp(msg_data.mtext, "quit") == 0) {
break;
}
printf("A: %s\n", msg_data.mtext);
}
// 退出进程
_exit(0);
}
int main(int argc, const char* argv[])
{
// 1.创建key
key_t key = ftok("/home/liu", 45);
if (-1 == key) {
perror("ftok");
return -1;
}
// 2.创建消息队列
int msqid = msgget(key, IPC_CREAT | 0664);
if (-1 == msqid) {
perror("msgget");
return -1;
}
// 3.创建线程, 用于获取消息
pthread_t tid;
if (0 != pthread_create(&tid, NULL, task, &msqid)) {
printf("pthread_create error\n");
return -1;
}
// 4.标记线程分离
// pthread_cancel(tid);
// 5.定义消息包
struct msgbuf msg_data;
// 设置消息类型
msg_data.mtype = 200;
// 6.向消息队列中发消息
while (1) {
// 输入消息数据
// printf("请输入消息数据:");
scanf("%s", msg_data.mtext);
getchar();
// 发消息
msgsnd(msqid, &msg_data, sizeof(msg_data.mtext), IPC_NOWAIT);
// 判断是否退出
if (strcasecmp(msg_data.mtext, "quit") == 0) {
break;
}
}
// 删除消息队列
msgctl(msqid, IPC_RMID, NULL);
return 0;
}
2.作业二
// 一个进程对共享内存中的数据打印,另一个进程对共享内存中的数据倒置。
// 提示:共享内存中存储:flag+字符串
print.c
#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
int main(int argc, const char* argv[])
{
// 创建key
key_t key = ftok("/home", 'k');
if (-1 == key) {
perror("ftok");
return -1;
}
// 创建共享内存
int shmid = shmget(key, 128, IPC_CREAT | 0664);
if (-1 == shmid) {
perror("shmget");
return -1;
}
// 映射共享内存
void* rd_shm = shmat(shmid, NULL, 0);
if (rd_shm == (void*)-1) {
perror("shmat");
return -1;
}
while (1) {
// 读取标识
if (!*((int*)rd_shm)) {
printf("%s\n", (char*)rd_shm + 4);
// 设置标识
*(int*)rd_shm = 1;
}
}
return 0;
}
inversion.c
#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, const char* argv[])
{
// 创建key
key_t key = ftok("/home", 'k');
if (-1 == key) {
perror("ftok");
return -1;
}
// 创建共享内存
int shmid = shmget(key, 128, IPC_CREAT | 0664);
if (-1 == shmid) {
perror("shmget");
return -1;
}
// 映射共享内存
void* wt_shm = shmat(shmid, NULL, 0);
if (wt_shm == (void*)-1) {
perror("shmat");
return -1;
}
// 输入字符串
char buf[100] = "";
printf("input string:");
scanf("%s", buf);
// 设置标识
*(int*)wt_shm = 0;
char* str = (char*)wt_shm + 4;
// 向共享内存写入字符串
strcpy(str, buf);
int start = 0;
int end = strlen(buf) - 1;
while (1) {
if (*(int*)wt_shm) {
start = 0;
end = strlen(buf) - 1;
// 逆置
while (start < end) {
str[start] = str[start] ^ str[end];
str[end] = str[start] ^ str[end];
str[start] = str[start] ^ str[end];
start++;
end--;
}
// 设置标识
*(int*)wt_shm = 0;
}
}
return 0;
}