linux中函数execl一直无法调用成功,如何正确地传参数?

发布于 2022-09-07 20:19:55 字数 854 浏览 35 评论 0

1.在linux环境下,调用execl:

if((pid=fork())<0){
            printf("fork error\n");
        }else if(pid==0){  /*child*/
            if(execl("/sbin/ifconfig","ifconfig","eth0","hw","ether",eth0_num,NULL)<0){
                exit(1);
            }else{
                exit(0);        
            }    
}

2.其中eth0_num变量是另一个函数调用返回的,是一个指针:

函数调用原型:int read_data(int addr,char* data,int len)
实际调用方式:read_data(4, eth0_num,6);/*从地址4,读6个字节,到eth0_num*/

3.但是运行的时候回报错:

ifconfig: invalid hw-addr 

4.我打印eth0_num的值是:0x7e8b8bf4

打印*eth0_num,*(eth0_num+1),*(eth0_num+2)的值是: 00  90  8f

值没错,但是一直行不通,我试过另一种方式
直接复制char *eth0_num="1eed19271ab3";然后调用execl,不使用从函数调用read_data的参数,就能ifconfig成功

5.各位给个意见,看如何才能通过传变量参数的方式,因为我需要从其他地方读值回来

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

累赘 2022-09-14 20:19:55

execl() 的参数是 char* 类型,你应该把网卡地址的 6 字节转换成字符串。

比如你读取的 6 字节是 00 01 02 03 04 05 ,要转换成 "00:01:02:03:04:05"

参考代码

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

void read_data(char* data)
{
    // 模拟网卡地址 00 01 02 03 04 05
    unsigned char source[6] = { 0, 1, 2, 3, 4, 5 };
    memcpy(data, source, 6);
}

int main()
{
    pid_t pid;
    char macBin[6];  // 字节:00 01 02 03 04 05 06
    char macHex[18];  // 16进制字符串: "00:01:02:03:04:05"

    read_data(macBin);
    // 将 6 字节转换成 16 进制字符串
    snprintf(macHex, sizeof(macHex),
            "%02X:%02X:%02X:%02X:%02X:%02X",
            macBin[0],
            macBin[1],
            macBin[2],
            macBin[3],
            macBin[4],
            macBin[5]);

    if ((pid = fork()) == -1) {
        perror(NULL);
    } else if (pid == 0) {
        execl("/usr/bin/ip", "ip", "link", "set", "eth0", "address", macHex, NULL);
        perror(NULL);
    }
}

顺便提一下,用 ip 工具代替 ifconfig 吧。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文