mirror of
https://github.com/0voice/kernel_new_features.git
synced 2026-11-01 13:15:06 +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