进程通信:消息队列、信号量、共享存储、UNIX域套接字
见《深入理解LINUX内核v3》Page:796
消息队列:
sprintf(MsgPath,"/recMsg%d", ID);
mq_unlink(MsgPath);
mqd_t mqdes = mqd_t mq_open(const char *name, int oflag, va_list args)
ps:mq_open(MsgPath, O_CREAT|O_RDWR|O_EXCL, DEFAULT_MSG_MODE, &mqa);
mq_send(mqd_t mqdes, const char *msg_ptr, size_t msg_len,, unsigned msg_prio)
mq_timedsend(mqdes, msg_ptr, msg_len, msg_prio, &timeout);
mq_receive(mqd_t mqdes,char msg_ptr, size_t msg_len, unsigned msg_prio);
mq_timedreceive(mqdes, msg_ptr, msg_len, msg_prio, &timeout);
信号量:
sem_init(sem_t *sem, o,unsigned value)
sem_t *sem_open(const char *name, int oflag, ...)
sem_post(sem_t *sem)
if (wait_ms == NO_WAIT) {
sem_trywait(sem);
} else if (wait_ms == WAIT_FOREVER) {
sem_wait(sem);
} else {
sem_timedwait(sem, &timeout);
}
共享存储
shmid =shmget(flag,size);
shmat(shmid,NULL,0);
shmdt(shm);
shmctl(shmid,IPC_RMID,NULL);
UNIX域套接字
cli_connect:
fd = socket(AF_UNIX, SOCK_STREAM, 0);
un.sun_family=AF_UNIX;
sprintf(un.sun_path, "%s%05d", CLI_PATH, getpid());
unlink(un.sun_path);
bind(fd, (struct sockaddr *)&un, len);
connect(fd, (struct sockaddr *)&un, len);
nwrite = write(clifd, sendbuf, header.len);
nread = recv(clifd, recvbuf, RECV_BUF_LEN, 0);
serv_listen:
fd = socket(AF_UNIX, SOCK_STREAM, 0);
un.sun_family = AF_UNIX;
strcpy(un.sun_path, name);
bind(fd, (struct sockaddr *)&un, len);
listen(fd, QLEN);
clifd = accept(listenfd, (struct sockaddr *)&un, (socklen_t *)&len);
nread = recv(clifd, recvbuf, leftlen, 0);
nwrite = send(clifd, sendbuf, strlen(sendbuf), 0);