初学-Linux多进程---popen函数

前言

在我们使用system函数和exec族函数的时候,我们发现,我们没有办法获取到,执行之后的值。那么popen函数就解决了这个事情。

popen函数

popen函数是一个标准c库中的函数,可以用于打开一个进程来执行shell命令并返回文件指针,以便读取该命令的输出。

函数原型:

我们在终端使用man popen命令,查询到函数信息如下:

#include <stdio.h>

FILE *popen(const char *command, const char *type);

int pclose(FILE *stream);

返回值

popen():  on  success,  returns a pointer to an open stream that can be
used to read or write to the pipe; if  the  fork(2)  or  pipe(2)  calls
fail, or if the function cannot allocate memory, NULL is returned.

popen函数在调用成功的时候则返回这个FILE结构体的指针,这个指针可以进行读写操作(fwrite fread等)。如果调用失败,则返回NULL。

参数说明

其中,command参数是要执行的命令,type参数则是指示打开文件的模式。type可以是“r”来获取命令的输出,也可以是“w”来向命令的输入传递数据。popen函数返回一个标准的文件流指针,可以使用这个指针来读取命令的输出或向命令的输入传递数据。

接下来我们使用一下这个函数:

#include <stdio.h>

int main()
{	
	FILE* fp;
	char str[1024];
	if((fp = popen("ls -l","r"))==NULL)
	{
		printf("popen faild\n");
	}
	fread(str,sizeof(char),sizeof(str),fp);
	printf("text:%s\n",str);
	fclose(fp);
	return 0;
}

上述示例中,程序使用popen来执行"ls -l"命令,并使用返回的文件指针来读取命令的输出,然后将输出打印到终端上。最后使用pclose来关闭文件指针。结果如下:

text:总计 80
-rw-rw-r-- 1 hyx hyx   328  3月 24 14:24 01fork.c
-rw-rw-r-- 1 hyx hyx   534  3月 24 14:59 02fork.c
-rw-rw-r-- 1 hyx hyx   535  3月 24 15:31 03vfork.c
-rw-rw-r-- 1 hyx hyx   621  3月 24 16:37 04wait.c
-rw-rw-r-- 1 hyx hyx   643  3月 24 17:41 05waitpid.c
-rw-rw-r-- 1 hyx hyx   139  3月 27 11:33 06system.c
-rw-rw-r-- 1 hyx hyx   143  3月 28 23:07 07text.c
-rw-rw-r-- 1 hyx hyx   217  3月 28 23:31 08execl.c
-rw-rw-r-- 1 hyx hyx   217  3月 29 00:00 09date.c
-rw-rw-r-- 1 hyx hyx   209  3月 29 00:11 10execlp.c
-rw-rw-r-- 1 hyx hyx   235  3月 29 00:27 11execvp.c
-rw-rw-r-- 1 hyx hyx   245  3月 29 14:19 11popen.c
-rwxrwxr-x 1 hyx hyx 16184  3月 29 14:19 a.out
-rwxrwxr-x 1 hyx hyx 15960  3月 28 23:09 test

需要注意的是,popen函数也可以用于将数据传递给外部命令。只需将mode参数设置为"w",然后将需要传递的数据写入文件指针即可。

我们可以使用一下:

#include <stdio.h>
#include <string.h>

int main()
{	
	FILE* fp;
	char *command =  "cat > output.txt";
	char str[1024];
	if((fp = popen(command,"w"))==NULL)
	{
		printf("popen faild\n");
	}
	fprintf(fp,"hello word\n");
	fprintf(fp,"this is some text write\n");
	fclose(fp);
	return 0;
}

在这个例子中,我们使用了cat > output.txt命令。

cat命令通常用于读取文件内容并将其输出到标准输出,但当我们使用>重定向时,它会从标准输入读取内容并将其写入到指定的文件中。因此,当我们使用popen以"w"模式打开这个命令时,我们可以向它写入数据,这些数据将被写入到output.txt文件中。

结果如下:

hyx@hyx-virtual-machine:~/c_project/c_Process$  cat output.txt  #我们查看一下生成的output.txt文件
hello word
this is some text write

总结

总结一下,popen函数在Linux环境下是一个非常有用的工具,能够方便地执行外部命令并处理命令的输入和输出。然而,在使用popen函数时,需要特别留意安全问题,并对输入进行适当的验证和处理。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
本书全面介绍了UNIX系统的程序设计界面—系统调用界面和标准C库提供的许多函数。 本书的前15章着重于理论知识的阐述,主要内容包括UNIX文件和目录、进程环境、进程控制、 进程间通信以及各种I/O。在此基础上,分别按章介绍了多个应用实例,包括如何创建数据库函数库, PostScript 打印机驱动程序,调制解调器拨号器及在伪终端上运行其他程序的程序等。 本书内容丰富权威, 概念清晰精辟,一直以来被誉为UNIX编程的“圣经”,对于所有UNIX程序员—无论是初学者还是专家级人士 —都是一本无价的参考书籍。 目 录 译者序 译者简介 前言 第1章 UNIX基础知识 1 1.1 引言 1 1.2 登录 1 1.2.1 登录名 1 1.2.2 shell 1 1.3 文件和目录 2 1.3.1 文件系统 2 1.3.2 文件名 2 1.3.3 路径名 2 1.3.4 工作目录 4 1.3.5 起始目录 4 1.4 输入和输出 5 1.4.1 文件描述符 5 1.4.2 标准输入、标准输出和标准 出错 5 1.4.3 不用缓存的I/O 5 1.4.4 标准I/O 6 1.5 程序和进程 7 1.5.1 程序 7 1.5.2 进程和进程ID 7 1.5.3 进程控制 7 1.6 ANSI C 9 1.6.1 函数原型 9 1.6.2 类属指针 9 1.6.3 原始系统数据类型 10 1.7 出错处理 10 1.8 用户标识 11 1.8.1 用户ID 11 1.8.2 组ID 12 1.8.3 添加组ID 12 1.9 信号 12 1.10 UNIX时间值 14 1.11 系统调用和库函数 14 1.12 小结 16 习题 16 第2章 UNIX标准化及实现 17 2.1 引言 17 2.2 UNIX标准化 17 2.2.1 ANSI C 17 2.2.2 IEEE POSIX 18 2.2.3 X/Open XPG3 19 2.2.4 FIPS 19 2.3 UNIX实现 19 2.3.1 SVR4 20 2.3.2 4.3+BSD 20 2.4 标准和实现的关系 21 2.5 限制 21 2.5.1 ANSI C限制 22 2.5.2 POSIX限制 22 2.5.3 XPG3限制 24 2.5.4 sysconf、pathconf 和fpathconf 函数 24 2.5.5 FIPS 151-1要求 28 2.5.6 限制总结 28 2.5.7 未确定的运行时间限制 29 2.6 功能测试宏 32 2.7 基本系统数据类型 32 2.8 标准之间的冲突 33 2.9 小结 34 习题 34 第3章 文件I/O 35 3.1 引言 35 3.2 文件描述符 35 3.3 open函数 35 3.4 creat函数 37 3.5 close函数 37 3.6 lseek函数 38 3.7 read函数 40 3.8 write函数 41 3.9 I/O的效率 41 3.10 文件共享 42 3.11 原子操作 45 3.11.1 添加至一个文件 45 3.11.2 创建一个文件 45 3.12 dup和dup2函数 46 3.13 fcntl函数 47 3.14 ioctl函数 50 3.15 /dev/fd 51 3.16 小结 52 习题 52 第4章 文件和目录 54 4.1 引言 54 4.2 stat, fstat和lstat函数 54 4.3 文件类型 55 4.4 设置-用户-ID和设置-组-ID 57 4.5 文件存取许可权 58 4.6 新文件和目录的所有权 60 4.7 access函数 60 4.8 umask函数 62 4.9 chmod和fchmod函数 63 4.10 粘住位 65 4.11 chown, fchown和 lchown函数 66 4.12 文件长度 67 4.13 文件截短 68 4.14 文件系统 69 4.15 link, unlink, remove和rename 函数 71 4.16 符号连接 73 4.17 symlink 和readlink函数 76 4.18 文件的时间 76 4.19 utime函数 78 4.20 mkdir和rmdir函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坏柠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值