mirror of
https://github.com/0voice/kernel_new_features.git
synced 2026-02-03 10:34:08 +08:00
Create 示例程序:提交队列轮询.c
This commit is contained in:
145
io_uring/示例程序:提交队列轮询.c
Normal file
145
io_uring/示例程序:提交队列轮询.c
Normal file
@@ -0,0 +1,145 @@
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include <liburing.h>
|
||||
#include <string.h>
|
||||
|
||||
#define BUF_SIZE 512
|
||||
#define FILE_NAME1 "/tmp/io_uring_sq_test.txt"
|
||||
#define STR1 "What is this life if, full of care,\n"
|
||||
#define STR2 "We have no time to stand and stare."
|
||||
|
||||
void print_sq_poll_kernel_thread_status() {
|
||||
|
||||
if (system("ps --ppid 2 | grep io_uring-sq" ) == 0)
|
||||
printf("Kernel thread io_uring-sq found running...\n");
|
||||
else
|
||||
printf("Kernel thread io_uring-sq is not running.\n");
|
||||
}
|
||||
|
||||
int start_sq_polling_ops(struct io_uring *ring) {
|
||||
int fds[2];
|
||||
char buff1[BUF_SIZE];
|
||||
char buff2[BUF_SIZE];
|
||||
char buff3[BUF_SIZE];
|
||||
char buff4[BUF_SIZE];
|
||||
struct io_uring_sqe *sqe;
|
||||
struct io_uring_cqe *cqe;
|
||||
int str1_sz = strlen(STR1);
|
||||
int str2_sz = strlen(STR2);
|
||||
|
||||
fds[0] = open(FILE_NAME1, O_RDWR | O_TRUNC | O_CREAT, 0644);
|
||||
if (fds[0] < 0 ) {
|
||||
perror("open");
|
||||
return 1;
|
||||
}
|
||||
|
||||
memset(buff1, 0, BUF_SIZE);
|
||||
memset(buff2, 0, BUF_SIZE);
|
||||
memset(buff3, 0, BUF_SIZE);
|
||||
memset(buff4, 0, BUF_SIZE);
|
||||
strncpy(buff1, STR1, str1_sz);
|
||||
strncpy(buff2, STR2, str2_sz);
|
||||
|
||||
int ret = io_uring_register_files(ring, fds, 1);
|
||||
if(ret) {
|
||||
fprintf(stderr, "Error registering buffers: %s", strerror(-ret));
|
||||
return 1;
|
||||
}
|
||||
|
||||
sqe = io_uring_get_sqe(ring);
|
||||
if (!sqe) {
|
||||
fprintf(stderr, "Could not get SQE.\n");
|
||||
return 1;
|
||||
}
|
||||
io_uring_prep_write(sqe, 0, buff1, str1_sz, 0);
|
||||
sqe->flags |= IOSQE_FIXED_FILE;
|
||||
|
||||
sqe = io_uring_get_sqe(ring);
|
||||
if (!sqe) {
|
||||
fprintf(stderr, "Could not get SQE.\n");
|
||||
return 1;
|
||||
}
|
||||
io_uring_prep_write(sqe, 0, buff2, str2_sz, str1_sz);
|
||||
sqe->flags |= IOSQE_FIXED_FILE;
|
||||
|
||||
io_uring_submit(ring);
|
||||
|
||||
for(int i = 0; i < 2; i ++) {
|
||||
int ret = io_uring_wait_cqe(ring, &cqe);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Error waiting for completion: %s\n",
|
||||
strerror(-ret));
|
||||
return 1;
|
||||
}
|
||||
/* Now that we have the CQE, let's process the data */
|
||||
if (cqe->res < 0) {
|
||||
fprintf(stderr, "Error in async operation: %s\n", strerror(-cqe->res));
|
||||
}
|
||||
printf("Result of the operation: %d\n", cqe->res);
|
||||
io_uring_cqe_seen(ring, cqe);
|
||||
}
|
||||
|
||||
print_sq_poll_kernel_thread_status();
|
||||
|
||||
sqe = io_uring_get_sqe(ring);
|
||||
if (!sqe) {
|
||||
fprintf(stderr, "Could not get SQE.\n");
|
||||
return 1;
|
||||
}
|
||||
io_uring_prep_read(sqe, 0, buff3, str1_sz, 0);
|
||||
sqe->flags |= IOSQE_FIXED_FILE;
|
||||
|
||||
sqe = io_uring_get_sqe(ring);
|
||||
if (!sqe) {
|
||||
fprintf(stderr, "Could not get SQE.\n");
|
||||
return 1;
|
||||
}
|
||||
io_uring_prep_read(sqe, 0, buff4, str2_sz, str1_sz);
|
||||
sqe->flags |= IOSQE_FIXED_FILE;
|
||||
|
||||
io_uring_submit(ring);
|
||||
|
||||
for(int i = 0; i < 2; i ++) {
|
||||
int ret = io_uring_wait_cqe(ring, &cqe);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Error waiting for completion: %s\n",
|
||||
strerror(-ret));
|
||||
return 1;
|
||||
}
|
||||
/* Now that we have the CQE, let's process the data */
|
||||
if (cqe->res < 0) {
|
||||
fprintf(stderr, "Error in async operation: %s\n", strerror(-cqe->res));
|
||||
}
|
||||
printf("Result of the operation: %d\n", cqe->res);
|
||||
io_uring_cqe_seen(ring, cqe);
|
||||
}
|
||||
printf("Contents read from file:\n");
|
||||
printf("%s%s", buff3, buff4);
|
||||
}
|
||||
|
||||
int main() {
|
||||
struct io_uring ring;
|
||||
struct io_uring_params params;
|
||||
|
||||
if (geteuid()) {
|
||||
fprintf(stderr, "You need root privileges to run this program.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
print_sq_poll_kernel_thread_status();
|
||||
|
||||
memset(¶ms, 0, sizeof(params));
|
||||
params.flags |= IORING_SETUP_SQPOLL;
|
||||
params.sq_thread_idle = 2000;
|
||||
|
||||
int ret = io_uring_queue_init_params(8, &ring, ¶ms);
|
||||
if (ret) {
|
||||
fprintf(stderr, "Unable to setup io_uring: %s\n", strerror(-ret));
|
||||
return 1;
|
||||
}
|
||||
start_sq_polling_ops(&ring);
|
||||
io_uring_queue_exit(&ring);
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user