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

Sheldon
  • 24

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

回复
阅读 2k
1 个回答
✓ 已被采纳

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 吧。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏