execl() 的参数是 char* 类型,你应该把网卡地址的 6 字节转换成字符串。
比如你读取的 6 字节是 00 01 02 03 04 05,要转换成 "00:01:02:03:04:05"。
参考代码
#include
#include
#include
#include
#include
#include
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 吧。