返回值问题及goto问题
来源:互联网 发布:c语言运算符与优先级 编辑:程序博客网 时间:2024/05/06 21:19
应用调用驱动时返回时,int do_sys_poll()返回类型是int ,其返回值fdcount应该为1,但是并没有return语句,所以做这个测试(对do_sys_poll中的goto理解有误)
gcc版本:gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu8)
ubuntu版本:ubuntu 9.10
printchar返回类型为int,但是函数没有return语句
hello.c:
#include<stdio.h>int printchar(void){ printf("aa\n");}int main(){ int ret=0; ret = printchar(); printf("ret = %d\n", ret); return 0;}
cc hello.croot@book-desktop:/home/book# ./a.out aaret = 3
增加printchar中的a数目,然后编译执行,其打印如下:
root@book-desktop:/home/book# cc hello.c root@book-desktop:/home/book# ./a.out aaaaaaaaaaret = 11root@book-desktop:/home/book# vim hello.c root@book-desktop:/home/book# cc hello.c root@book-desktop:/home/book# ./a.out aaaaaaaaaaaret = 12
hello.c
#include<stdio.h>int main(){int ret[3]={0,0,0}, i;int a=0;for(i=0; i<3; i++)if(ret[i]>0)goto out;a= 3;out:printf("a = %d\n", a);return 5;return a;}
运行结果:
root@book-desktop:/home/book# cc hello.c root@book-desktop:/home/book# ./a.out a = 3root@book-desktop:/home/book# echo $?5
由程序及运行结果可知,goto out语句没有执行,循环完了后,执行a=3, printf("a = %d", a); return 5;所以说out这段代码goto out可以用,goto out不执行(数组中没有大于0的数)时即数组查询完毕后执行执行a=3和out代码printf("a = %d", a); return 5;
do_sys_poll函数实现源码,此与forth_drv实验poll机制有关:
int do_sys_poll(struct pollfd __user *ufds, unsigned int nfds, s64 *timeout){struct poll_wqueues table; int fdcount, err; unsigned int i;struct poll_list *head; struct poll_list *walk;/* Allocate small arguments on the stack to save memory and be faster - use long to make sure the buffer is aligned properly on 64 bit archs to avoid unaligned access */long stack_pps[POLL_STACK_ALLOC/sizeof(long)];struct poll_list *stack_pp = NULL;/* Do a sanity check on nfds ... */if (nfds > current->signal->rlim[RLIMIT_NOFILE].rlim_cur)return -EINVAL;poll_initwait(&table);head = NULL;walk = NULL;i = nfds;err = -ENOMEM;while(i!=0) {struct poll_list *pp;int num, size;if (stack_pp == NULL)num = N_STACK_PPS;elsenum = POLLFD_PER_PAGE;if (num > i)num = i;size = sizeof(struct poll_list) + sizeof(struct pollfd)*num;if (!stack_pp)stack_pp = pp = (struct poll_list *)stack_pps;else {pp = kmalloc(size, GFP_KERNEL);if (!pp)goto out_fds;}pp->next=NULL;pp->len = num;if (head == NULL)head = pp;elsewalk->next = pp;walk = pp;if (copy_from_user(pp->entries, ufds + nfds-i, sizeof(struct pollfd)*num)) {err = -EFAULT;goto out_fds;}i -= pp->len;}fdcount = do_poll(nfds, head, &table, timeout);/* OK, now copy the revents fields back to user space. */walk = head;err = -EFAULT;while(walk != NULL) {struct pollfd *fds = walk->entries;int j;for (j=0; j < walk->len; j++, ufds++) {if(__put_user(fds[j].revents, &ufds->revents))goto out_fds;}walk = walk->next; }err = fdcount;if (!fdcount && signal_pending(current))err = -EINTR;out_fds:walk = head;while(walk!=NULL) {struct poll_list *pp = walk->next;if (walk != stack_pp)kfree(walk);walk = pp;}poll_freewait(&table);return err;}
若do_poll调用完后返回值为1即fdcount =1,若goto out_fds的while,if条件满足,就直接跳到out_fds标号处,最后return err相当于 return -EFAULT,若while if的条件不满足不执行goto out_fds,则err = fdcount =1,由于fdcount =1,则if条件为if(0)
if (!fdcount && signal_pending(current))err = -EINTR;然后执行out_fds段代码,此时return err相当于return 1即do_sys_poll的返回值为1
poll机制留待下回分析
0 0
- 返回值问题及goto问题
- goto问题
- goto语句的“跳跃”问题
- goto语句的“跳跃”问题
- C++ goto 编译出错问题
- 堆栈内存分配 及 函数返回值问题
- try,catch,finally执行及返回值的问题
- 堆栈内存分配 及 函数返回值问题
- 关于open()返回值及打印输出的问题
- gcc中scanf的使用及返回值问题
- 关于JAVA中引用及返回值的问题
- ExecuteNonQuery()返回值问题
- find_by_sql 返回值问题
- 返回值优化问题
- ExecuteNonQuery() 返回值 问题
- 函数返回值问题
- HQL返回值问题
- fopen返回值问题
- LeetCode 7. Reverse Integer
- EXCEL增加审计功能,记录每个单元格的修改日志(支持记录多个单元格同时修改时记录审计信息)
- HDU-4363-Dragon Ball
- JAVA反射机制个人学习
- poj1423 hdu1018 Big Number
- 返回值问题及goto问题
- Swift,Objective-C语言性能对比测试
- How to use Session in MVC4
- [LeetCode125]ZigZag Conversion
- 滚动条的自定义
- MFC中获取App,MainFrame,Doc和View类等指针的方法
- MFC工作线程中获得视图类指针问题
- 泛泰A860 Andorid4.4.3 KTU84M (Omni) 图赏
- 记一次惨痛的引用错jquery的事件