- 論壇徽章:
- 15
|
本帖最后由 yulihua49 于 2016-08-15 16:16 編輯
cokeboL 發(fā)表于 2016-08-15 14:53 ![]()
不太清楚你們具體的業(yè)務場景,各種ipc機制和鎖這些,就像過家家,不同的業(yè)務場景和需求,可以有太多中擺法。 ...
個人偏愛C是因為癖好,喜歡玩機器,C更像在使用一個機器。其他語言更高級,接近于任務描述,應該是好用些,但是資源控制更間接,有時不知他怎么干的,需要優(yōu)化也無從下手。
那幾個fd,你在網(wǎng)上搜搜,有詳細說明。配合epoll完成非IO異步操作的。
這里有一個eventfd配合epoll進行文件異步IO的例子:
- /*******************************************
- * 需要linux 2.6.22 以上版本
- * 和libaio 3.107以上版本
- * 如果不具備這個條件,在makefile里用SIO_fd.o
- * 取代本模塊
- *******************************************/
- #include <unistd.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <sys/eventfd.h>
- #include <libaio.h>
- #include <scsrv.h>
- static int AIO_oper(int fd,char *buff,size_t iosize,int flg)
- {
- io_context_t myctx;
- int rc,num;
- uint64_t finished_aio;
- struct iocb _iocb,*io=&_iocb;
- struct io_event event;
- int efd = eventfd(0, 0);
- T_YIELD yield=get_yield();
- if (efd == -1) {
- return flg?write(fd,buff,iosize):read(fd,buff,iosize);
- }
- memset(&myctx,0,sizeof(myctx));
- io_set_eventfd(io,efd);
- io_queue_init(1, &myctx);
- if(flg) io_prep_pread(io, fd, buff, iosize, 0);
- else io_prep_pwrite(io, fd, buff, iosize, 0);
- rc = io_submit(myctx, 1, &io);
- if(rc<0) {
- close(efd);
- io_destroy(myctx);
- return flg?write(fd,buff,iosize):read(fd,buff,iosize);
- }
- if(yield) {
- rc = yield(efd,0,0);//efd提交給epoll,并yield and resume.
- if(rc==0) eventfd_read(efd, &finished_aio);
- }
- close(efd);
- num = io_getevents(myctx, 1, 1, &event, NULL);
- if(num>0) {
- if(event.res2==0) num=event.res;
- else num=-1;
- }
- io_destroy(myctx);
- return num;
- }
- int AIO_read(int fd,char *buff,size_t iosize)
- {
- return AIO_oper(fd,buff,iosize,0);
- }
- int AIO_write(int fd,char *buff,size_t iosize)
- {
- return AIO_oper(fd,buff,iosize,1);
- }
復制代碼 |
|