首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用C popen():read()起作用,但fread()不起作用

使用C语言中的popen()函数可以创建一个管道,并执行一个shell命令。popen()函数返回一个文件指针,可以用于读取命令的输出。而fread()函数则是用于从文件中读取数据的。

在使用popen()函数时,可以通过传入"r"参数来创建一个只读的管道。然后可以使用read()函数来读取命令的输出。read()函数会将输出内容读取到一个缓冲区中,并返回读取的字节数。可以通过循环读取的方式,将所有的输出内容读取完毕。

示例代码如下:

代码语言:txt
复制
#include <stdio.h>

int main() {
    FILE *fp;
    char buffer[1024];

    fp = popen("ls", "r");
    if (fp == NULL) {
        printf("Failed to run command\n");
        return 1;
    }

    while (fgets(buffer, sizeof(buffer), fp) != NULL) {
        printf("%s", buffer);
    }

    pclose(fp);

    return 0;
}

上述代码中,使用popen()函数执行了一个"ls"命令,并将输出内容打印到屏幕上。

而fread()函数则是用于从文件中读取数据的。它的使用方式如下:

代码语言:txt
复制
#include <stdio.h>

int main() {
    FILE *fp;
    char buffer[1024];

    fp = fopen("file.txt", "r");
    if (fp == NULL) {
        printf("Failed to open file\n");
        return 1;
    }

    fread(buffer, sizeof(char), sizeof(buffer), fp);
    printf("%s", buffer);

    fclose(fp);

    return 0;
}

上述代码中,使用fopen()函数打开了一个名为"file.txt"的文件,并使用fread()函数将文件中的内容读取到缓冲区中,并打印到屏幕上。

综上所述,使用C语言中的popen()函数可以执行shell命令并读取输出,而fread()函数则是用于从文件中读取数据的。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux通过匿名管道进行进程间通信

在前面,介绍了一种进程间的通信方式:使用信号,我们创建通知事件,并通过它引起响应,传递的信息只是一个信号值。这里将介绍另一种进程间通信的方式——匿名管道,通过它进程间可以交换更多有用的数据。...二、使用popen函数 1、popen函数和pclose函数介绍 有静就有动,有开就有关,与此相同,与popen函数相对应的函数是pclose函数,它们的原型如下: #include <stdio.h...如果open_mode是”r”,主调用程序就可以使用被调用程序的输出,通过函数返回的FILE指针,就可以能过stdio函数(如fread)来读取程序的输出;如果open_mode是”w”,主调用程序就可以向被调用程序发送数据...源文件名为popen.c,代码如下: #include #include #include #include ...特别提醒: 1、从函数的原型我们可以看到,它跟popen函数的一个重大区别是,popen函数是基于文件流(FILE)工作的,而pipe是基于文件描述符工作的,所以在使用pipe后,数据必须要用底层的

1.3K21
  • 【操作系统】进程间的通信——管道

    小示例1:主进程关闭写进程后,无法给子进程使用管道发送数据,此时子进程使用read函数进行数据的读取,如果 没有数据可读,则会进行阻塞,代码&结果如下所示: 解释:主进程循环5次,给子进程发送数据。...相关参考——linux系统编程之进程(五):exec系列函数(execl,execlp,execle,execv,execvp)使用 main5.c #include #include...popen/pclose popen的作用:用于在两个进程之间传递数据:在程序A中使用popen调用程序B时,有两种用法: 程序A读取程序B的输出(使用fread读取); 程序A发送数据给程序B,以作为程序...\n"); exit(1); } cnt = fread(buff, sizeof(char), BUFF_SIZE, file);//fread是从文件指针中读取 if (cnt > 0)...---- popen的优缺点 优点:可以使用shell扩展(比如命令中可以使用通配符)。使用方便。 缺点:每调用一次popen,将要启动两个进程(shell和被指定的程序)。资源消耗大。 ----

    60820

    linux c程序中获取shell脚本输出

    使用popen   在学习unix编程的过程中,发现系统还提供了一个popen函数,可以非常简单的处理调用shell,其函数原型如下:   FILE *popen(const char *command...采用这种方法,既避免了创建临时文件,又不受输出字符数的限制,推荐使用。   popen使用FIFO管道执行外部程序。   ...r表示command从管道中读入,w表示 command通过管道输出到它的stdout,popen返回FIFO管道的文件流指针。pclose则用于使用结束后关闭这个指针。   ..."); //新建一个可写的文件   fread( buf, sizeof(char), sizeof(buf), stream); //将刚刚FILE* stream的数据流读取到buf中   fwrite...  -rwxr-xr-x 1 root root 1105 09-30 11:49 popen.c   -rwxr-xr-x 1 root root 443 09-30 00:55 system.c

    5.6K20

    PHP进程通信之管道与消息队列(二十三节)

    里我错误地认为是阻塞在fread上)。...除了posix_mkfifo()外,PHP里还有一个叫做popen()的函数,原型是popen ( string $command , string $mode )。...php $handle = popen('ls -l', 'r'); $read = fread($handle, 2096); echo $read; pclose($handle); 上面demo的意思非常简单...「锁」的问题 popen():隐式创建半双工管道,代码使用上比较简单 proc_open():隐式创建全双工管道,还有众多的控制细节 ---- 消息队列 这个怕是很多人都听过,不过印象往往停留在kafka...ftok函数实际上第二个参数确实是个整形数字,范围是0-255,我也不知道PHP为啥用字母;如果你搞过C,你应该知道实际上在C里字符本质上是数字,确切说字母a就是ASCII的数字97,明白了吧。

    1.4K31

    L001 Linux和android ndk 外部程序调用popen 和system的用法

    我们支持,linux常用的调用外部指令,有两个接口ppen和system popen使用 函数原型 #include FILE * popen ( const char * command...这行命令将被传到 bin/sh 并使用-c 标志,shell 将执行这个命令。 popen 的返回值是个标准 I/O 流,必须由 pclose 来终止。前面提到这个流是单向的。...使用举例 /**运行命令 *1. cmd 要执行的命令 *2. 参数type可使用“r”代表读取,“w”代表写入。...(cmd,type); ret = fread ( resultBuffer, 1, len, pp ); pclose(pp); return ret...只需在命令中加入重定向 例如: cp -f 2>&1 system调用 system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令

    2.9K20

    BugKu-Web-Simple_SSTI_1&Simple_SSTI_2(浅析SSTI模板注入!)

    .init:这部分试图访问某个类的初始化方法,前面提到的子类列表访问是错误的,所以这一步也是错误的。....globals[‘popen’](‘echo FLAG’).read():这部分首先尝试访问当前对象的全局符号表(字典),然后试图在其中查找popen键,并执行其对应的值(一个命令)。...__globals__['os'].popen('ls ../').read()}} 对于这段命令,在第一题,我也是有所提及,相差不大 这里略作解释 python中popen函数主要是用来执行linux...__globals__['os'].popen('cat /app/flag').read()}} 当让我们还可以使用Linux中find命令来查找flag的路径 ?flag={{config....__globals__['os'].popen('cat /app/flag').read()}} 拿下flag: flag{1f13963c42fa39b5aae92e25d1627851}

    55810

    3分钟短文 | 大神救我!18G的大文件,PHP咋按行读取?

    == false) { // process the line read. } fclose($handle); } else { // error opening...the file. } 首先打开文件句柄,然后逐行使用 fgets 读取,处理完毕后使用 fclose 显式关闭。...当然,你也可以不必使用 false 判断,转而使用 feof 检测是否到文件末尾即可: if ($file = fopen("file.txt", "r")) { while(!...比起我们常用的一些文件操作函数: fgetss() - 从文件指针中读取一行并过滤掉 HTML 标记 fread() - 读取文件(可安全用于二进制文件) fgetc() - 从文件指针中读取字符 stream_get_line...() - 从资源流里读取一行直到给定的定界符 fopen() - 打开文件或者 URL popen() - 打开进程文件指针 fsockopen() - 打开一个网络连接或者一个Unix套接字连接 stream_set_timeout

    1.2K20
    领券