思维导图
1.使用消息队列实现2个终端之间的互相聊天功能
typedef struct msgbuf{
long mtype;
char mtext[255];
}msg_t;
int main(int argc,const char *argv[])
{
int fd =open("./ipc",O_EXCL|O_CREAT,0666);
if(fd!=-1){
close(fd);
}
//创建密钥
//第二个参数非0即可,8bit位,1~255.
key_t key=ftok("./ipc",1);
if(key==-1){
perror("ftok");
return 1;
}
//根据密钥访问消息队列,获取队列d
//参数二,一般写IPCCREATI0666表示如果队列不在,则以666的权限创建该消息队列
int id =msgget(key,IPC_CREAT|0566);
if(id=-1){
perror("msgget");
return 1;
}
int res =fork();
//读写该消息队列
if(res>0){
while(1){
msg_t buf;
buf.mtype=1;
printf("请输入:");
scanf("%s",buf.mtext);
while(getchar()!=10);
//向消息对列传输数据
msgsnd(id,&buf,strlen(buf.mtext),0);
usleep(1000);
}
}else if(res==0){
while(1){
msg_t buf;
msgrcv(id,&buf,sizeof (buf.mtext),2,0);
printf("接受到2队列到消息为:%s\n",buf.mtext);
}
}
return 0;
}
typedef struct msgbuf{
long mtype;
char mtext[256];
}msg_t;
int main(int argc,const char *argv[])
{
int fd=open("./ipc",O_EXCL | O_CREAT,0666);
if(fd=1){
close(fd);
}
key_t key=ftok("./ipc",1);
if(key==-1){
perror("ftok");
return 1;
}
int id =msgget(key,IPC_CREAT|0666);
if(id==-1){
perror("msgget");
return 1;
}
int res=fork();
if(res>0){
while(1){
msg_t buf;
buf.mtype=2;
printf("请输入:");
scanf("%s" ,buf.mtext);
while(getchar()!=10);
msgsnd(id,&buf,strlen(buf.mtext),0);
usleep(1000);
}
}else if (res ==0){
while(1){
msg_t buf;
msgrcv(id,&buf,sizeof(buf.mtext),1,0);
printf("接受到1队列的消息为:%s\n",buf.mtext);
}
}
return 0;
}
2.创建一对父子进程,父进程循环输出 A,子进程循环输出a 使用信号灯集同步这对父子进程,实现效果 A_a_A_a ..... _表示休眠1秒
void sempost(int id,int n){
struct sembuf buf = {0};
buf.sem_num = n;
buf.sem_op = 1;
buf.sem_flg = SEM_UNDO;
semop(id,&buf,1);
}
void semwait(int id,int n){
struct sembuf buf = {0};
buf.sem_num = n;
buf.sem_op = -1;
buf.sem_flg = SEM_UNDO;
semop(id,&buf,1);
}
int main(int argc, const char *argv[])
{
key_t key = ftok("./ipc",1);
// 创建一个信号灯集,里面有2个信号量
int id = semget(key,2,IPC_CREAT | 0666);
// 初始化第0个信号量,值为0
semctl(id,0,SETVAL,0);
// 初始化第1个信号量,值为1
semctl(id,1,SETVAL,1);
int res = fork();
if(res > 0){
while(1){
// 让第1个信号量 -1
semwait(id,1);
printf("A\n");
sleep(1);
// 让第0个信号量 +1
sempost(id,0);
}
}else if(res == 0){
while(1){
// 让第0个信号量 -1
semwait(id,0);
printf("a\n");
sleep(1);
// 让第1个信号量+1
sempost(id,1);
}
}
return 0;
}
3.使用共享内存 + 信号灯集实现2个终端之间互相聊天