热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

APUE获取网卡ip字段以及文本切割命令的使用

昨夜西风凋碧树,独上高楼,望尽天涯路。——五代晏殊蝶恋花最近学习了APUE的一系列函数,要求用ifconfig命令来获取本机的网卡ip&#

昨夜西风凋碧树,独上高楼,望尽天涯路。——五代·晏殊·蝶恋花


最近学习了APUE的一系列函数,要求用ifconfig命令来获取本机的网卡ip,下面根据学长的博客复述一段代码来获取ip字段:

/********************************************************************************** Copyright: (C) 2017 tangyanjun<519656780&#64;qq.com>* All rights reserved.** Filename: apue.c* Description: This file * * Version: 1.0.0(05/11/17)* Author: tangyanjun <519656780&#64;qq.com>* ChangeLog: 1, Release initial version on "05/11/17 20:02:56"* ********************************************************************************/
#include
#define sizeofbuf 512int main(int argc, char **argv)
{
char buf[sizeofbuf];
FILE *fp;
char ch; snprintf(buf, sizeof(buf), "ifconfig eth0|grep &#39;inet addr&#39;|awk &#39;{print $2}&#39;|cut -d \":\" -f2"); //拷贝到buf中。
fp &#61; popen(buf, "r"); if(NULL &#61;&#61; fp)
{
printf("error!\n");
return -1;
} while(EOF !&#61; (ch &#61; fgetc(fp))) //读
{
fputc(ch, stdout); //写
}
}

./a.out
编译之后就能输出我们的eth0的ip。

写这篇文章的任务就是分析一下这个代码的一些函数以及截取文本的命令&#xff0c;因为后面做的GPS定位还要获取经度纬度&#xff0c;估计得用到&#xff0c;下面就一起来学习一下这些东东。

snprintf

snprintf( )函数用于将格式化的数据写入字符串&#xff0c;其原型&#xff1a;
int snprintf(char *str, int n, char format [, argument, …]);*

参数
其中str为要写入的字符串&#xff1b;n为要写入的字符的最大数目&#xff0c;超过n会被截断&#xff1b;format为格式化字符串&#xff0c;argument为变量。

返回值
成功则返回参数str***字符串长度&#xff0c;失败则返回-1***&#xff0c;错误原因存于errno中。

snprintf( )的优点是能够控制要写入的字符串的长度&#xff0c;更加安全&#xff0c;只要稍加留意&#xff0c;不会造成缓冲区的溢出

下面给一段小小的测试&#xff1a;

#include int main(int argc, char **agv){char str[5];int ret &#61; snprintf(str, 3, "%s", "stupid");printf("%d\n", ret);printf("%s\n", str);return 0;}

输出&#xff1a;
6
st

这里注意了&#xff0c;既然是3个字符&#xff0c;为什么我们只输出st呢&#xff1f;因为我们的Linux下gcc会在后面补一个‘\0’字符&#xff0c;
而在VC中就不会多出个’\0’字符。


popen

popen( )函数通过创建一个管道&#xff0c;调用fork( )产生一个子进程&#xff0c;执行一个shell命令以运行命令来开启一个进程&#xff0c;这个管道由pclose( )函数关闭
pclose()函数关闭标准I/O流&#xff0c;等待命令执行结束&#xff0c;然后返回shell的终止状态。如果shell不能被执行&#xff0c;则pclose()返回的终止状态与shell已执行exit一样。

函数定义

#include FILE * popen(const char *command , const char *type);
int pclose(FILE *stream);

参数

type参数只能为读或写其中一种&#xff0c;得到的返回值也一样&#xff0c;如果type是”r“则文件指针连接到command的标准输出&#xff1b;如果type是”w“则文件指针连接到command的标准输入

command参数是一个shell命令字符串的指针&#xff0c;shell将执行这个命令。

返回值

如果调用fork()或pipe()失败&#xff0c;或者不能分配内存将返回NULL&#xff0c;否则返回标准I/O流。popen()没有为内存分配失败设置errno值。如果调用fork()或pipe()时出现错误&#xff0c;errno被设为相应的错误类型。如果type参数不合法&#xff0c;errno将返回EINVAL。

下面给出一段程序来测试一下&#xff1a;

#include int main(int argc, char **argv){FILE *fd;char buf[20] &#61; {0};fd &#61; popen("ls","r");if(NULL &#61;&#61; fd){printf("error!\n");return -1;}while(fgets(buf, 20, fd) !&#61; NULL){printf("%s", buf);}pclose(fd);return 0;}

编译后执行可列出我们当前路径的文件列表。


fgetc

fgetc( )从文件中读入一个字符&#xff0c;其调用形式&#xff1a;
ch&#61;fgetc(pFile);
当fgetc成功从文件中读入字符后&#xff0c;ch就是读取到的字符&#xff0c;如果读取失败&#xff0c;则ch&#61;EOF。其中EOF为一个符号常量&#xff0c;当做-1来处理就行。


fputc

fputc( )将一个字符写入到文件中&#xff0c;其调用形式为&#xff1a;
fputc(ch,pFile);

ch为要写入的字符&#xff0c;pFile是指向FILE结构的指针&#xff0c;通过fopen函数打开文件可获得pFile&#xff0c;失败则返回EOF。

这里当读取的值为EOF时&#xff0c;就说明已经读完了&#xff0c;所以EOF在读写文件中扮演重要的角色。

下面给一个程序来测试一下这两个函数&#xff1a;

#include int main(int argc, char **argv){char ch;FILE *p;FILE *q;p &#61; fopen("p.txt", "r");q &#61; fopen("q.txt", "w");if((NULL &#61;&#61; p) || (NULL &#61;&#61; q)){printf("failed\n");return 0;}ch &#61; fgetc(p);while(EOF !&#61; ch){fputc(ch, q);ch &#61; fgetc(p);}printf("OK!\n");fclose(p);fclose(q);}

这个程序我们创建一个**已有的**p.txt文档&#xff0c;然后打开一个新的q.txt&#xff0c;从p.txt中读字符&#xff0c;然后写入q.txt中&#xff0c;一个字一个字符的读&#xff0c;直到遇见EOF&#xff08;即文件结尾&#xff09;&#xff0c;然后完成。

函数介绍完了&#xff0c;下面说一说我们的几个截取字段的命令。


grep

grep命令直接抓取当前文本的字符行&#xff0c;这里不细说了。


awk

awk &#39;{print $2}&#39; //默认以空格为分隔符分成几个块&#xff0c;这里截取第二个块

当然&#xff0c;我们的分隔符是根据我们的需求来划分模块的&#xff0c;这里要注意的是awk是每行按空格或其他字符来划分的。

下面举个基本的例子咯&#xff1a;
log.txt的内容&#xff1a;

2 this is a test
3 Are you like awk
This&#39;s a test
10 There are orange,apple,mongo

每行按空格或TAB分割&#xff0c;输出文本的1、4项&#xff1a;
1. $awk &#39;{print $1,$4}&#39; log.txt

2 a
3 like
This&#39;s
10 orange,apple,mongo

使用“&#xff0c;”分割&#xff1a;
2.awk -F&#xff0c;&#39;{print $1,$2}&#39; log.txt

2 this is a test3 Are you like awkThis&#39;s a test10 There are orange apple

3.设置变量&#xff1a;
awk -v

$awk -va&#61;1 &#39;{print $1,$1&#43;a}&#39; log.txt

2 33 4This&#39;s 110 11

还有很多的功能这里就不再深入了&#xff0c;等要用的时候再仔细查询吧。


cut

语法&#xff1a;

cut [-bn] [file]
cut [-c] [file]
cut [-df] [file]

cut命令从文件的每一行剪切字节、字符和字段并将这些写至标准输出。

参数

-b &#xff1a;以字节为单位进行分割。这些字节位置将忽略多字节字符边界&#xff0c;除非也指定了 -n 标志。
-c &#xff1a;以字符为单位进行分割。
-d &#xff1a;自定义分隔符&#xff0c;默认为制表符。
-f &#xff1a;与-d一起使用&#xff0c;指定显示哪个区域。
-n &#xff1a;取消分割多字节字符。仅和 -b 标志一 起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的<br />范围之内&#xff0c;该字符将被写出&#xff1b;否则&#xff0c;该字符将被排除。

当然&#xff0c;cut命令一般与“|”连用。

好啦&#xff0c;cut命令非常简单实用&#xff0c;这里就不赘述啦。

这样&#xff0c;这个程序就搞定了&#xff0c;以后截取字符串的功能就可以用它来实现了。

更详细的文档&#xff1a;http://www.runoob.com/linux/linux-comm-awk.html


推荐阅读
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 本题旨在通过给定的评级信息,利用拓扑排序和并查集算法来确定全球 Tetris 高手排行榜。题目要求判断是否可以根据提供的信息生成一个明确的排名表,或者是否存在冲突或信息不足的情况。 ... [详细]
  • 在本教程中,我们将深入探讨如何使用 Python 构建游戏的主程序模块。通过逐步实现各个关键组件,最终完成一个功能完善的游戏界面。 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 探讨ChatGPT在法律和版权方面的潜在风险及影响,分析其作为内容创造工具的合法性和合规性。 ... [详细]
  • 本文详细解释了华为ENSP模拟器中常用的命令,涵盖用户模式、系统模式、接口模式和地址池视图模式下的操作。这些命令对于进行计算机网络实验至关重要,帮助用户更好地理解和配置路由器及PC机的通信。 ... [详细]
  • 本文介绍了一种从与src同级的config目录中读取属性文件内容的方法。通过使用Java的Properties类和InputStream,可以轻松加载并获取指定键对应的值。 ... [详细]
  • 本文将详细探讨Linux pinctrl子系统的各个关键数据结构,帮助读者深入了解其内部机制。通过分析这些数据结构及其相互关系,我们将进一步理解pinctrl子系统的工作原理和设计思路。 ... [详细]
  • 配置多VLAN环境下的透明SQUID代理
    本文介绍如何在包含多个VLAN的网络环境中配置SQUID作为透明网关。网络拓扑包括Cisco 3750交换机、PANABIT防火墙和SQUID服务器,所有设备均部署在ESXi虚拟化平台上。 ... [详细]
  • This pull request introduces the ability to provide comprehensive paragraph configurations directly within the Create Note and Create Paragraph REST endpoints, reducing the need for additional configuration calls. ... [详细]
  • 在成功安装和测试MySQL及Apache之后,接下来的步骤是安装PHP。为了确保安全性和配置的一致性,建议在安装PHP前先停止MySQL和Apache服务,并将MySQL集成到PHP中。 ... [详细]
  • 方法:1 配置数据库basediros.path.abspath(os.path.dirname(__file__))  #获取当前文件的绝对路径appFlask(__name__ ... [详细]
  • 本文详细解释了为什么在成功执行移动赋值操作后,对象的析构函数会被调用,并提供了代码示例和详细的分析。 ... [详细]
author-avatar
成事r2003
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有