computing-offload/qtfs/demo/cfifo_r.c
Yikun Jiang a68570b5d9 Add computing offloading code
1. Add computing offloading code
2. Add script.md
3. Add virsh_demo.xml

Change-Id: Id9ef883e2f0eb727eb5448b9d1c47767f46b1021
Signed-off-by: Yikun Jiang <yikunkero@gmail.com>
2023-10-23 19:29:57 +08:00

99 lines
2.3 KiB
C

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <sys/epoll.h>
#define BUF_MAX 256
int single_read(int argc, char *argv[])
{
char buf[BUF_MAX];
char *fifo = argv[1];
int rfd = open(fifo, O_RDONLY);
if (rfd < 0) {
printf("open file %s failed.\n", fifo);
return 0;
}
do {
memset(buf, 0, BUF_MAX);
int ret = read(rfd, buf, BUF_MAX);
if (ret == -1) {
printf("read failed.\n");
break;
}
printf("%s", buf);
} while (strcmp(buf, "exit") != 0);
close(rfd);
return 0;
}
#define MAX_READ_LEN 65536
int my_epoll_read(int argc, char *argv[])
{
int *fd = (int *)malloc((argc - 1) * sizeof(int));
char *buf = (char *)malloc(MAX_READ_LEN);
for (int i = 1; i < argc; i++) {
fd[i-1] = open(argv[i], O_RDONLY|O_NONBLOCK);
if (fd[i-1] < 0){
printf("open file %s failed.\n", argv[i]);
return 0;
}
printf("my epoll read open file:%s success, fd:%d.\n", argv[i], fd[i-1]);
}
struct epoll_event evt;
struct epoll_event *evts;
int epfd = epoll_create1(0);
if (epfd == -1) {
printf("epoll create failed.\n");
abort();
}
for (int i = 0; i < argc - 1; i++) {
evt.data.fd = fd[i];
evt.events = EPOLLIN;
int s = epoll_ctl(epfd, EPOLL_CTL_ADD, fd[i], &evt);
if (s == -1) {
printf("epoll ctl failed, fd:%d\n", fd[i]);
abort();
}
printf("my epoll read epoll ctl fd:%d events:%x success.\n", fd[i], evt.events);
}
evts = calloc(64, sizeof(evt));
while (1) {
int n = epoll_wait(epfd, evts, 64, -1);
printf("epoll wait get new %d events.\n", n);
for (int i = 0; i < n; i++) {
int ret;
FILE *fp;
printf(" > epoll wait new events, cur:%d key:%x data:%lx n:%d.\n", i, evts[i].events, evts[i].data, n);
memset(buf, 0, MAX_READ_LEN);
if (evts[i].events & EPOLLHUP) {
epoll_ctl(epfd, EPOLL_CTL_DEL, evts[i].data.fd, NULL);
continue;
}
fp = fdopen(evts[i].data.fd, "r");
fseek(fp, 0, SEEK_SET);
ret = read(evts[i].data.fd, buf, MAX_READ_LEN);
if (ret <= 0) {
printf(" >read fd:%d ret:%d data error.\n", evts[i].data.fd, ret);
goto end;
} else {
printf(" >read fd:%d ret:%d data:%s.\n", evts[i].data.fd, ret, buf);
}
}
}
end:
close(epfd);
for (int i = 0; i < argc-1; i++) {
close(fd[i]);
}
return 1;
}
int main(int argc, char *argv[])
{
return my_epoll_read(argc, argv);
}