如何附加“;ifconfig";在C语言的.txt文件中?

如何附加“;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

我正在尝试用C获得我自己的ip地址。 其思想是获取“ifconfig”的输出,将其放在一个.txt文件中,并提取inet和inet6值。 我尝试在.txt文件中写入ifconfig输出:

#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脚本本身,有两种基本方法:

  • 一枪

    例如,在Linux中解析
    LANG=C LC\u ALL=C ip address
    输出。 打印地址后,程序/脚本将退出

  • 连续的

    程序/脚本将打印ip地址信息,但不会退出,只要管道保持打开状态,它就会运行,在接口关闭或打开时提供更新

    在Linux中,程序/脚本可以使用DBUS或NetworkManager来等待此类事件;它不需要轮询(即重复检查命令输出)

  • shell脚本还有一个额外的好处,它可以同时支持多个发行版,甚至是操作系统(至少跨POSIX系统)。这些脚本通常具有类似的大纲:

    #!/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);
        }