如何附加“;ifconfig";在C语言的.txt文件中?
我正在尝试用C获得我自己的ip地址。 其思想是获取“ifconfig”的输出,将其放在一个.txt文件中,并提取inet和inet6值。 我尝试在.txt文件中写入ifconfig输出:如何附加“;ifconfig";在C语言的.txt文件中?,c,ip,screen-scraping,fopen,ifconfig,C,Ip,Screen Scraping,Fopen,Ifconfig,我正在尝试用C获得我自己的ip地址。 其思想是获取“ifconfig”的输出,将其放在一个.txt文件中,并提取inet和inet6值。 我尝试在.txt文件中写入ifconfig输出: #include <stdio.h> #include <stdlib.h> #include <string> int main () { char command[1000]; strcpy(command, "ifconfig"); syste
#include <stdio.h>
#include <stdlib.h>
#include <string>
int main ()
{
char command[1000];
strcpy(command, "ifconfig");
system(command);
FILE *fp = fopen("textFile.txt", "ab+");
//... how to write the output of 'system(command)' in the textFile.txt?
fclose(fp);
//... how to scraping a file .text in C ???
return 0;
}
#包括
#包括
#包括
int main()
{
char命令[1000];
strcpy(命令,“ifconfig”);
系统(指挥部);
FILE*fp=fopen(“textFile.txt”、“ab+”);
//…如何在textFile.txt中写入“系统(命令)”的输出?
fclose(fp);
//…如何在C中删除文件.text???
返回0;
}
谢谢你的帮助和建议,
Stefano您实际上希望使用系统调用来完成此任务,而不是运行ifconfig命令 对于Linux,这里有一个类似的问题: (由于ifconfig是一个Linux命令,我假设您正在询问Linux) 一般的要点是使用
ioctl()
系统调用
否则,您将分叉您的进程以将其一分为二,创建一个从子进程的输出到父进程的输入的管道,并对子进程调用exec以将其替换为“ifconfig”。然后,如果您想从中获得有用的信息,就必须解析字符串。在Linux中,use描述了您可以使用的接口,正如前面所回答的那样
这是非常简单和健壮的,并且使用很少的资源(因为它只是几个系统调用)。不幸的是,它是特定于Linux的,并且使代码不可移植
这是可以通过便携方式实现的。我在这里描述可移植选项,因为特定于Linux的选项非常简单。尽管仅获取本地主机IP地址的方法相当复杂,但该模式通常出人意料地有用,因为它可以隐藏系统特定的怪癖,同时方便系统管理员自定义行为
可移植解决方案的思想是使用一个小型助手程序或shell脚本来获取信息,并让它以某种易于解析的格式将信息输出到主程序。如果您的应用程序名为yourapp
,通常会在/usr/lib/yourapp/
中安装此类帮助程序,例如/usr/lib/yourapp/local ip address
就我个人而言,我建议使用shell脚本(这样系统管理员可以在需要自定义行为时轻松地编辑助手),以及输出格式,其中每个接口都位于自己的行上,字段之间可能用空格分隔
inet接口名称ipv4地址[主机名]*
inet6接口名称ipv6地址[主机名]* i、 e.第一个令牌指定地址族,第二个令牌指定接口名称,第三个令牌指定地址,可选地后跟与该地址对应的主机名或别名 至于helper程序/shell脚本本身,有两种基本方法:
LANG=C LC\u ALL=C ip address
输出。
打印地址后,程序/脚本将退出#!/bin/sh
export LANG=C LC_ALL=C
case "$(uname -s)" in
Linux)
if [ -x /bin/ip ]; then
/bin/ip -o address | awk \
'/^[0-9]*:/ {
addr = $4
sub(/\/.*$/, "", addr)
printf "%s %s %s\n", $3, $2, addr
}'
exit 0
elif [ -x /sbin/ifconfig ]; then
/sbin/ifconfig | awk \
'BEGIN {
RS = "[\t\v\f\r ]*\n"
FS = "[\t\v\f ]+"
}
/^[0-9A-Za-z]/ {
iface = $1
}
/^[\t\v\f ]/ {
if (length(iface) > 0)
for (i = 1; i < NF-1; i++)
if ($i == "inet") {
addr = $(i+1)
sub(/^addr:/, "", addr)
printf "inet %s %s\n", iface, addr
} else
if ($i == "inet6") {
addr = $(i+2)
sub(/\/.*$/, "", addr)
printf "inet6 %s %s\n", iface, addr
}
}'
exit 0
fi
;;
# Other systems?
esac
printf 'Cannot determine local IP addresses!\n'
exit 1
我省略了解析代码,因为有太多的选择--strtok()
,sscanf()
,甚至还有一个将行拆分为标记(并填充指针数组)的自定义函数--我自己的首选选项是最不受欢迎的(最后一个,自定义函数)
虽然这项任务所需的代码几乎不值得花时间,但使用这种方法的应用程序往往会使用一些这样的助手。然后,当然,选择管道数据格式是有意义的,它允许轻松解析,但支持所有用例。摊销成本也更容易接受。假设您使用的是linux,请再次查看,假设您使用的是linux,请检查此项。您还需要检查原始文件是否有任何新的内容。您希望如何使用DHCP/zeroconf?XY问题。要么从你的界面上获取IP,要么通过其他可移植的方式。是的,Ubuntu 16.04。谢谢。我怀疑屏幕刮擦标签不属于这里。只是一个高层次的建议。。一旦通过编程确定了获取接口IP地址的方法,就没有必要将其写入文件,然后从该文件读取以进行解析。一旦你得到信息,就在内存中进行解析,如果你还想这样做的话,就把信息写到一个文件中。
#define _POSIX_C_SOURCE 200809L
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
/* ... */
FILE *in;
char *line_ptr = NULL;
size_t line_size = 0;
ssize_t line_len;
int status;
in = popen("/usr/lib/myapp/local-ip-addresses", "r");
if (!in) {
fprintf(stderr, "Cannot determine local IP addresses: %s.\n", strerror(errno));
exit(EXIT_FAILURE);
}
while (1) {
line_len = getline(&line_ptr, &line_size, in);
if (line_len < 1)
break;
/* Parse line_ptr */
}
free(line_ptr);
line_ptr = NULL;
line_size = 0;
if (ferror(in) || !feof(in)) {
pclose(in);
fprintf(stderr, "Read error while obtaining local IP addresses.\n");
exit(EXIT_FAILURE);
}
status = pclose(in);
if (!WIFEXITED(status) || WEXITSTATUS(status)) {
fprintf(stderr, "Helper utility /usr/lib/myapp/local-ip-addresses failed to obtain local IP addresses.\n");
exit(EXIT_FAILURE);
}