热门标签 | 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


推荐阅读
  • 想把一组chara[4096]的数组拷贝到shortb[6][256]中,尝试过用循环移位的方式,还用中间变量shortc[2048]的方式。得出的结论:1.移位方式效率最低2. ... [详细]
  • 本文详细介绍了如何在 Ubuntu 14.04 系统上搭建仅使用 CPU 的 Caffe 深度学习框架,包括环境准备、依赖安装及编译过程。 ... [详细]
  • 本文通过分析一个具体的案例,探讨了64位Linux系统对32位应用程序的兼容性问题。案例涉及OpenVPN客户端在64位系统上的异常行为,通过逐步排查和代码测试,最终定位到了与TUN/TAP设备相关的系统调用兼容性问题。 ... [详细]
  • 本文探讨了Linux环境下线程私有数据(Thread-Specific Data, TSD)的概念及其重要性,介绍了如何通过TSD技术避免多线程间全局变量冲突的问题,并提供了具体的实现方法和示例代码。 ... [详细]
  • 本文分享了作者在使用LaTeX过程中的几点心得,涵盖了从文档编辑、代码高亮、图形绘制到3D模型展示等多个方面的内容。适合希望深入了解LaTeX高级功能的用户。 ... [详细]
  • C/C++中一级指针的内存模型与示例代码
    本文通过一个具体的C/C++代码示例,详细解析了一级指针在内存中的布局和工作原理。包括了对不同类型的指针变量如何在内存中分配空间的讨论。 ... [详细]
  • C/C++ 应用程序的安装与卸载解决方案
    本文介绍了如何使用Inno Setup来创建C/C++应用程序的安装程序,包括自动检测并安装所需的运行库,确保应用能够顺利安装和卸载。 ... [详细]
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • 探讨了一个包含纯虚函数的C++代码片段,分析了其中的语法错误及逻辑问题,并提出了修正方案。 ... [详细]
  • 本文详细介绍了在 Red Hat Linux 系统上安装 GCC 4.4.2 的步骤,包括必要的依赖库的安装及常见问题的解决方法。 ... [详细]
  • 本文详细介绍了Linux系统中信号量的相关函数,包括sem_init、sem_wait、sem_post和sem_destroy,解释了它们的功能和使用方法,并提供了示例代码。 ... [详细]
  • 本文详细介绍了如何在ARM架构的目标设备上部署SSH服务端,包括必要的软件包下载、交叉编译过程以及最终的服务配置与测试。适合嵌入式开发人员和系统集成工程师参考。 ... [详细]
  • 本文介绍了使用Python和C语言编写程序来计算一个给定数值的平方根的方法。通过迭代算法,我们能够精确地得到所需的结果。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
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社区 版权所有