记录linux下调用execl()时碰到的一个问题。
在程序里要执行iwlist命令,以获取所以连接在自身热点上的连接列表。
参考网址:
linux执行命令并获取结果(system): https://www.cnblogs.com/bwbfight/p/10682722.html
在这个文章里,创建了一个临时文件用于system()命令的输出,在调用system()之前,先创建该临时文件,核心代码:
tmp_fd = mkstemp(tmpfile);
if(tmp_fd < 0)
{
printf("mkstemp failed\n");
return -1;
}
close(tmp_fd);
sprintf(cmd_string, "%s > %s 2>&1", cmdstring, tmpfile);/*标准输出(1),标准错误(2)都输出到临时文件*/
if(system_ex(cmd_string, 20) < 0)
{
printf("run \"%s\" ret < 0!\n", cmd_string);
}
fd = open(tmpfile, O_RDONLY);
if(fd < 0)
{
printf("open %s failed!\n", tmpfile);
nbytes = -1;
}
else
{
nbytes = read(fd, buff, size - 1);
close(fd);
}
其中 system_ex()函数中的核心就是调用
execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
本文要说的是,对sysem_ex()调用前后的临时文件问题。按照这个代码(我把临时文件改成了我自己的目录和普通的文件名,并且采用fopen()来创建),我发现,命令的输出是写不到文件里的,在执行命令的时候,会有无权限的打印。通过查看,文件是创建成功的,但文件内容是空的。
然后,我把调用system_ex()之前的创建文件给注释掉,再运行时,文件就正常了,内容也写在里面了。
通过这个试验说明,在自动输出到文件之前的文件创建,实际上多余的一个步骤,完全没有必要,也不需要。