《UNIX网络编程》中 “值-结果参数(value-result)”应该怎么理解
《UNIX网络编程》中 “值-结果参数(value-result)”应该如何理解?2、与前面的传递方向相反,从内核到进程传递套
《UNIX网络编程》中 “值-结果参数(value-result)”应该如何理解?
2、与前面的传递方向相反,从内核到进程传递套接口地址结构有四个函数:accept、recvfrom、getsockname 和 getpeername。这4个函数的两个参数是:指向套接口地址结构的指针和指向表示结构大小的整数的指针,例如:
C/C++ code struct sockaddr_un cli; /* Unix domain */socklen_t len;len = sizeof(cli);getpeername(unixfd, (SA*) &cli, &len )/* len may have changed */
为何将结构大小由整数改为指向整数的指针呢?这是因为:当函数被调用时,结构大小是一个值(value, 此值告诉内核该结构的大小,使内核在写此结构时不至于越界),当函数返回时,结构大小又是一个结果(result,它告诉进程内核在此结构中确切存储了多少信息),这种参数叫做值-结果参数(value-result)。
*****************************
这段话中红色的部分阐述的原因应该怎么理解啊?不就是写成 &len 这样嘛,有这么多作用??请前辈们用自己的通俗易懂的话稍作解释下,thanks in advance!
[解决办法]这个可以理解为传址方式。这个地址的数据在函数中有可能被修改。
[解决办法]通俗一点的理解就是:参数既做value输入,又做result返回。
[解决办法]再通俗点,就是该参数既是输入参数也是输出参数
[解决办法]调用之前,给这个参数一个初值,表示一个最大容量,函数内部会使用这个初值
调用之后,函数会修改这个参数,表示实际使用的空间
比如,你调用之前,说我的钱包只能装3000,装吧
调用之后,函数说,装好了,给你装了500
[解决办法]C/C++ code#include <stdio.h>void a2(int *a){ int tmp; tmp = (*a) * (*a); *a = tmp;}int main(int ac, char **av){ int a; a = 5; printf("a = %d\n", a); a2(&a); printf("a = %d\n", a); return 0;}
[解决办法]
直接用len的话,函数怎么能修改这个参数?
[解决办法]
在从内核到进程传递套接口地址时会设置len的值,如果直接用len,就取不到那个值了。