进程通信(ipc)
来源:互联网 发布:购买域名的网站 编辑:程序博客网 时间:2024/05/20 23:04
1.管道 pipe
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include <fcntl.h>
#include<string.h>
#include<errno.h>
extern int errno;
int main()
{
if(access("write_fifo", F_OK) == -1)
{
int res = mkfifo("write_fifo", 0666);
if(res == -1)
{
printf("errno = %d\n",errno);
perror("mkfifo");
exit(1);
}
}
//printf("1111111111111111111\n");
int write_fd = open("write_fifo", O_WRONLY);
if(write_fd == -1)
{
perror("open write_fifo");
//unlink("write_fifo");
exit(1);
}
//printf("222222222222222222\n");
int read_fd = open("read_fifo",O_RDONLY);
if(read_fd == -1)
{
perror("open read_fifo");
exit(1);
}
char sendbuf[256];
char recvbuf[256];
while(1)
{
printf("Ser:>");
scanf("%s",sendbuf);
if(strcmp(sendbuf, "quit") == 0)
{
close(write_fd);
unlink("write_fifo");
break;
}
write(write_fd, sendbuf, strlen(sendbuf)+1);
read(read_fd, recvbuf, 256);
printf("Cli:>%s\n",recvbuf);
}
return 0;
}
2.信号量(P,V操作)三个系统调用函数:semget(),semop(),semctl()
#include<stdio.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<stdlib.h>
union semun
{
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
struct seminfo *__buf; /* Buffer (Linux-specific) */
};
int main()
{
key_t sem_key;
sem_key = ftok("mysem", 0xff);
if(sem_key == -1)
{
perror("ftok");
exit(1);
}
else
{
printf("sem_key = 0x%x\n",sem_key);
}
//create //get
int sem_id = semget(sem_key, 2, IPC_CREAT | IPC_EXCL | 0755);
if(sem_id == -1)
{
perror("semget");
exit(1);
}
else
{
printf("sem_id = %d\n",sem_id);
}
union semun init_val, init_val1;
init_val.val = 2;
init_val1.val = 3;
semctl(sem_id, 0, SETVAL, init_val);
semctl(sem_id, 1, SETVAL, init_val1);
struct sembuf op[2];
op[0].sem_num = 0;
op[0].sem_op = -1; //>0 ==0 <0
op[0].sem_flg = 0; //SEM_UNDO
op[1].sem_num = 1;
op[1].sem_op = -2;
op[1].sem_flg = 0;
semop(sem_id, op, 2);
int sem_val = semctl(sem_id, 0, GETVAL);
printf("sem_val = %d\n",sem_val);
sem_val = semctl(sem_id, 1, GETVAL);
printf ("sem_val1 = %d\n",sem_val);
return 0;
}
3.共享内存:sham()
shamget();创建一段新的共享内存;
shmat()和shmdt():shmat链接共享之内存,shmdt()断开链接;
shmctl():;控制共享内存的某些属性;
#include"utili.h"
int main()
{
key_t shm_key = ftok("myshm", 0xff);
if(shm_key == -1)
{
perror("ftok shm_key");
exit(1);
}
int shm_id = shmget(shm_key, 1024, IPC_CREAT|0755);
if(shm_id == -1)
{
perror("shmget");
exit(1);
}
void *shm_addr = shmat(shm_id, NULL, 0);
if(shm_addr == (void *) -1)
{
perror("shmat");
shmctl(shm_id, IPC_RMID, NULL);
exit(1);
}
/////////////////////////////////////////////////////////
key_t sem_key = ftok("myshm",0xfe);
int sem_id = semget(sem_key, 2, IPC_CREAT|IPC_EXCL|0755);
union semun init_val;
init_val.val = 0;
semctl(sem_id, 0, SETVAL, init_val);
semctl(sem_id, 1, SETVAL, init_val);
struct sembuf p = {1,-1, 0},
v = {0, 1, 0};
while(1)
{
printf("Ser:>");
scanf("%s",(char*)shm_addr);
if(strcmp((char*)shm_addr, "quit") == 0)
{
shmdt(shm_addr);
shmctl(shm_id, IPC_RMID, NULL);
break;
}
semop(sem_id, &v, 1);
semop(sem_id, &p, 1);
printf("Cli:>%s\n",(char*)shm_addr);
}
return 0;
}
5.消息队列 ::msg();
msgget()::创建一个消息队列;
msgsnd()::添加一条消息到消息队列中;
msgctl()::控制属性;
#include"../utili.h"
#define SEND_TYPE 100
#define RECV_TYPE 200
typedef struct MsgType
{
long msg_type;
char msg_buf[256];
}MsgType;
int main()
{
key_t msg_key;
msg_key = ftok("mymsg",0xff);
if(msg_key == -1)
{
perror("ftok");
exit(1);
}
int msg_id = msgget(msg_key, IPC_CREAT|0755);
if(msg_id == -1)
{
perror("msgget");
exit(1);
}
MsgType msg;
while(1)
{
printf("Ser:>");
scanf("%s",msg.msg_buf);
msg.msg_type = SEND_TYPE;
msgsnd(msg_id, &msg, strlen(msg.msg_buf)+1, 0);
msgrcv(msg_id, &msg, 256, RECV_TYPE, 0);
printf("Cli:>%s\n",msg.msg_buf);
}
return 0;
}
- 进程通信(ipc)
- 进程间通信(IPC)
- 进程间通信(IPC)
- linux进程通信(ipc)
- 进程间通信(IPC)
- 进程间通信(IPC)
- 进程间通信(IPC)
- 《进程间通信(IPC)》
- 进程间通信(IPC)
- 进程间通信(IPC)
- linux进程通信(IPC)
- 进程间通信(IPC)
- 进程间通信(IPC)
- 进程间通信(IPC)
- 进程间通信(IPC)
- 进程以及进程通信(IPC)类型
- [进程通信] Linux进程间通信(IPC)
- 进程间的通信(ipc)
- 如何用70行Java代码实现深度神经网络算法
- ROS学习:创建自己的工作空间
- Pycrypto与RSA密码技术笔记
- scala多线程
- 2017 Multi-University Training Contest
- 进程通信(ipc)
- 记一个TestNG的教程链接,适合入门学习
- PAT朋友数
- Android studio 项目构建七|压缩代码和资源
- 文件对话框CFileDialog类:打开和保存
- 中国剩余定理
- 微信公众号开发--接收与回复消息(Java)
- 前端跨域的问题
- cacheUtils