linux下的execl()调用

发布时间:2023年12月17日

记录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()之前的创建文件给注释掉,再运行时,文件就正常了,内容也写在里面了。

通过这个试验说明,在自动输出到文件之前的文件创建,实际上多余的一个步骤,完全没有必要,也不需要。

文章来源:https://blog.csdn.net/jszj/article/details/135029787
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。