1、popen函数
首先,让我们用man命令检查一下popen函数:
函数说明:
(1) popen ) )调用fork )生成子程序,从子进程调用/lgdjd/sh -c执行参数command的命令。
)2)参数type用“r”表示读取,用“w”表示写入。 基于此type值,popen ()将管道连接到子流程的标准输出设备或标准输入设备,并返回文件指针。 然后,进程可以使用此文件指针读取子进程的输出设备或将其写入子进程的标准输入设备。
(3)另外,用文件指针(FILE* )操作的所有函数都可以在fclose )以外使用。
)4)如果type为r,则调用过程读取到command的标准输出中。
如果type为w,则调用进程写入command的标准输入。
返回值:如果成功,则返回文件指针;否则返回NULL。错误原因存储在errno中。
*注意: **popen ()继承了环境变量,通过环境变量可能会导致系统安全问题。
具体示例:
1 #includestdio.h
2 #includestdlib.h
3 int main () )
4 {
5 FILE *fp;
6 char buffer[80];
7FP=popen(「cat/etc/passwd "," r " );
8fgets(buffer,sizeof ) buffer ),fp );
9打印(“% s”,buffer );
10pclose(FP;
11 }
1
2
3
4
5
6
7
8
9
10
11
执行结果:
2、系统函数
函数说明:
system ) )函数首先fork子进程,然后在该子进程中调用/lgdjd/sh -c以执行command指定的命令。 /lgdjd/sh是一种软链接,在系统中通常指常见的shell,如dash或bash。 -c选项指示shell从字符串command中读取要执行的命令。 shell扩展command的特殊字符。 父进程调用waitpid () )函数接收变成僵尸的子进程的尸体,获取其结束状态,并将其结束状态返回给system ) )函数的调用方。
返回值:
)1)如果参数command为空
如果参数为NULL,则system函数的返回值只需0和1即可。
返回1,表示可以使用系统的命令处理程序,即/lgdjd/sh。
相反,如果命令处理程序不可用,则返回0。
)2)如果参数command不为空
参数不为NULL时,情况有点复杂,根据APUE的不同,这里分为以下三种情况。
1 )如果系统调用(如fork )失败或waitpid函数出现非EINTR错误,system将返回-1
2 )如果全部执行失败,system返回127
3 )此外,system返回/lgdjd/sh的结束状态
系统源代码:
intsystem(constchar*cmdstring ) ) ) ) ) )。
{
pid_t pid;
int status;
if(cmdstring==null ) {
返回(1; }
if () PID=fork ) )0) {
状态=-1; }
elseif(PID==0) {
execl ()/LGDJD/sh )、" sh "、"-c "、cmdstring、(char * )0);
-exit(127; //如果子程序成功执行,则此语句不会执行
}
else{
while(waitpid(PID,status,0 )0) 0
IF (错误!=EINTER ) {
状态=-1;
黑;
}
}
}
返回状态;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
}
如果system接收到的命令为空,则直接返回。 如果不为NULL,则fork发出子进程。 由于fork在父进程和子进程中都返回,因此这里将检查返回的pid。 fork在子进程中返回0,在父进程中返回子进程的pid。 父进程使用waitpid等待子进程结束,子进程调用execl以调用程序((/LGdjd/sh )、) sh、)-c、cmdstring、) char* )0)
来源: CSDN
原文: 3359 blog.csdn.net/QQ _ 37964547/article/details/79720860
声明:本文为博主原创文章。 转载请附上博文链接!