在共享内存中放入一个字符串"1234567",创建两个进程,
1.一个进程倒置
2.另一个进程打印
3.要求打印的结果有序
4.提示:在共享内存中存储- -个flag
具体代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/wait.h>
struct shmdata
{
char buf[128];
int flag;
};
//倒置字符串
void Inversion(char *str)
{
int len = strlen(str);
for (int i = 0; i < len / 2; i++)
{
char t = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = t;
}
}
int main(int argc, const char *argv[])
{
//key的值
key_t key = ftok("/home/ubuntu/",1);
if(key <0)
{
perror("ftok");
return -1;
}
printf("key = %#x\n",key);
//创建共享内存
int shmid = shmget(key,sizeof(struct shmdata),IPC_CREAT|0666);
if(shmid <0)
{
perror("shmget");
return -1;
}
printf("shmid =%d\n",shmid);
//映射共享内存
struct shmdata *s = (struct shmdata *) shmat(shmid, NULL, 0);
if((void*) -1 == s)
{
perror("shmat");
return -1;
}
printf("s = %p\n",s);
strcpy(s->buf, "1234567");
s->flag = 0;
pid_t pid1=fork(); //进程1:倒置字符串
if(0 == pid1)
{
Inversion(s->buf);
s->flag=1;
return 0;
}
else if(pid1 > 0)
{
pid_t pid2=fork(); //进程2:打印字符串
if(0 == pid2)
{
while(0 == s->flag)
{
sleep(1);
}
printf("倒置后的字符串是: %s\n", s->buf);
return 0;
}
}
waitpid(pid1, NULL, 0); // 等待进程1结束
pid_t pid2;
waitpid(pid2, NULL, 0); // 等待进程2结束
shmdt(s); // 解除共享内存映射
shmctl(shmid, IPC_RMID, NULL); // 删除共享内存
return 0;
}
运行结果如下: