消息队列创建流程及代码示例

消息队列是消息的链接表,存放在内核中并由消息队列标示符标识。
1. 创建或打开一个队列
int msgget(key_t key, int flag);
key: 键 由ftok()生成
key_t ftok(const char* path, int id);
flag:IPC_CREAT 或 IPC_EXCL
2. 发送消息
int msgsnd(int msgid, const void* ptr, size_t nbyte, int flag);
msgid: 消息队列标识
ptr: 发送的消息,一般格式为:
struct _msg{
long mtype;
char _msg[512];
. . .
};
nbyte:消息大小,一般为sizeof(struct _msg)-sizeof(long)
flag: 0 默认阻塞方式
IPC_NOWAIT 非阻塞
3. 接收消息
int msgrcv(int msgid, void* ptr, size_t nbyte, long mtype, int flag);

msgQueue.h
#ifndef _MSGQUEUE_H_
#define _MSGQUEUE_H_

#include <iostream>
#include <sys/ipc.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/msg.h>

using namespace std;

#define KEYPATH "/tmp/count"
#define KEYPROJ 'a'
#define NAMESIZE 16
#define MTYPE 2

typedef struct {
long mtype;
char name[NAMESIZE];
int iChiScore;
int iEngScore;
int iMathScore;
} S_SCORE_ST;
#endif

send.c

#include "msgQueue.h"

int main()
{
int iRet = 0;
key_t key;
int msgid;
S_SCORE_ST score_st;
do {
key = ftok(KEYPATH, KEYPROJ);
if (key < 0) {
iRet = -1;
cout << "ftok() error : " << key << endl;
break;
}

msgid = msgget(key, IPC_CREAT);
if (msgid < 0) {
iRet = -1;
cout << "msgget() error : " << msgid << endl;
break;
}
strcpy(score_st.name, "leex");
score_st.iChiScore = 100;
score_st.iEngScore = 100;
score_st.iMathScore = 100;
score_st.mtype = MTYPE;

iRet = msgsnd(msgid, &score_st, sizeof(score_st)-sizeof(long), 0);
if (iRet < 0) {
cout << "msgsnd() error : " << iRet << endl;
break;
}

} while(false);
return iRet;
}

recv.c

#include "msgQueue.h"

int main()
{
int iRet = 0;
key_t key;
int msgid;
S_SCORE_ST score_st;
do {
key = ftok(KEYPATH, KEYPROJ);
if (key < 0) {
iRet = -1;
cout << "ftok() error : " << key << endl;
break;
}

msgid = msgget(key, IPC_CREAT);
if (msgid < 0) {
iRet = -1;
cout << "msgget() error : " << msgid << endl;
break;
}

while (1) {
iRet = msgrcv(msgid, &score_st, sizeof(score_st)-sizeof(long), MTYPE, 0);
if (iRet < 0) {
cout << "msgrcv() error : " << iRet << endl;
break;
}
cout << "name:\t" << score_st.name << endl;
cout << "chinese score:\t" << score_st.iChiScore << endl;
cout << "english score:\t" << score_st.iEngScore << endl;
cout << "math score:\t" << score_st.iMathScore << endl;
}
} while(false);
return iRet;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IAP(In-App Purchase)是指应用内购买,是一种应用商店的商业模式,允许用户在应用内购买虚拟物品或增值服务。在 iOS 开发中,通常使用 StoreKit 框架实现应用内购买。下面是 IAP 跳转 APP 的具体流程示例代码: 1. 在开发者中心创建应用并配置 IAP 商品 2. 在 Xcode 中创建应用,并添加 StoreKit 框架 3. 首先需要检查用户是否可以进行 IAP,可以使用以下代码: ```swift if SKPaymentQueue.canMakePayments() { // 用户可以进行 IAP } else { // 用户无法进行 IAP } ``` 4. 创建一个 SKProductRequest 对象,并查询 IAP 商品信息 ```swift let productIdentifiers: Set<String> = ["com.example.product1", "com.example.product2"] let request = SKProductsRequest(productIdentifiers: productIdentifiers) request.delegate = self request.start() ``` 5. 实现 SKProductsRequestDelegate 协议方法,处理查询结果 ```swift func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { let products = response.products for product in products { print("\(product.localizedTitle) - \(product.price)") } } func request(_ request: SKRequest, didFailWithError error: Error) { print("查询 IAP 商品信息失败:\(error.localizedDescription)") } ``` 6. 用户选择购买商品后,创建一个 SKMutablePayment 对象,并添加到 SKPaymentQueue 中 ```swift let payment = SKMutablePayment(product: product) payment.quantity = 1 SKPaymentQueue.default().add(payment) ``` 7. 监听交易队列 SKPaymentQueue 的购买状态,处理购买完成后跳转 APP ```swift func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { for transaction in transactions { switch transaction.transactionState { case .purchased: // 购买成功,跳转 APP SKPaymentQueue.default().finishTransaction(transaction) case .failed: // 购买失败 SKPaymentQueue.default().finishTransaction(transaction) case .restored: // 恢复购买 SKPaymentQueue.default().finishTransaction(transaction) case .deferred: // 交易处于等待状态 break case .purchasing: // 正在购买中 break } } } ``` 以上就是 IAP 跳转 APP 的具体流程示例代码。需要注意的是,在进行应用内购买时,应该保证用户能够清晰地知道所购买的商品或服务的实际价格和内容,并且购买过程应该简单明了,避免误导或误操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值