linux fgets :

linux fgets :,第1张

首先这个问题是段错误(core dumped),你得知道为什么会出现断错误,一般情况都是因为越界问题,为什么会有越界呢,你对内核所占的内存执行了非法的写 *** 作,你会问我哪里有啊?

struct servent *s这里 我觉得你就产生所谓的野指针,野指针就是不知道指向了内存的什碧丛饥么地方的指针,我想s这个指针就是指向了非法内存部分,而你s=getservbyname(name,pro)这里又有了 *** 作,我想应该是这里产生的郑纯段错误,其实要验证你这个错误的地方出来哪里,你可以gdb,然后run这样就可以知道错误处在哪里,

还有一个问题就是你说的gets这个“过时”了,不是你说的那样,gets只不过是有危险,会产生越界,而fgets呢 则不会,他会自动在你最后给你补上\0, gets则不会悔返,他会一直写,有的时候会写到非法内存,这个时候就会出现段错误了

希望对你有帮助,给最佳答案吧

fgets函数是从输入流中读取一个字符串,它是遇到换行符,或者搜陆激传输了限定的字符数量世袜,或者遇到EOF文件尾悉键就停止(它会把换行符也加到接收字符串里面)。fgets函数的原型是:

char *fgets(char *s, int n, FILE *stream)

函数参数说明:第一个参数是接收参数,用于接收输入文件流的字符串,第二个参数n是字符串传输长度限定参数,表示当接收了n-1个字符时停止写入,第三个参数是文件流(就是fopen函数返回的文件流),也可以是输入流stdin。使用这个函数需要include头文件<stdio.h>。

fgets函数和scanf的%s参数的区别是:scanf接收输入字符串时,是遇到空白字符就停止,而且scanf无法限定接收字符串的长度。

*** 作系统知道文件描述符对应的设备是否可读,所以实际是由内核提供系统调用来真正实现 select 的。

一般对于通过 fopen *** 作的文件,我们没必要用 select, 首先你要把 FILE * 转成对应的文件描述符,其次对于标准文件,一般情况下读和写是 non-block 的,select主要是用来对那些会block的设备用的。当然你硬要这么用,也没问题,但是 select 对于这种文件总是会返回可读的,和缓冲区里是否有内容无关(缓冲区的实现是在用户空间的,显然仔罩粗内核不知道其状态)。因为即使整个文件都被读入缓冲区,由于此时描述符处于 EOF 状态, select 仍然会返回可读。念镇

这里实在是有太多细节。 总之,闷带不建议滥用select,对于标准文件或者单个设备的读写,完全没意义。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12299815.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存