Linux —system、popen函数用法
一、system()函数
system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字 符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。
1、原型:
#include <stdlib.h>
int system(const char *command);
2、返回值:
如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。
如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为 system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
if(system("main aa bbb") == -1){
printf("system faill\n");
perror("why:");
}
printf("system susess\n");
system("pause");
return 0;
}
运行结果:
CLC@Embed_Learn:~$ gcc system.c
CLC@Embed_Learn:~$ ./a.out
argv[0]=main
argv[1]=aa
argv[2]=bbb
sh: 1: pause: not found
system susess
sh: 1: pause: not found
二、popen()函数
相比system/exec族函数好处,可以将程序运行的结果放到一个管道中方便捕获信息。
原型:
#include <stdio.h>
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);
参数说明:
command: 是指向以NULL结束的shell命令字符串的指针。
type: 权限;读、写(w、r)。
返回值:
如果调用成功,返回一个读\写指针,否则返回NULL
demo测试:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char readbuf[1024];
FILE *fd;
fd = popen("ps","r");
fread(readbuf,1024,1,fd);
printf("readbuf=\n%s\n",readbuf);
pclose(fd);
system("pause");
return 0;
}
运行结果:
CLC@Embed_Learn:~$ ./a.out
readbuf=
PID TTY TIME CMD
2870 pts/0 00:00:01 bash
9024 pts/0 00:00:00 a.out
9025 pts/0 00:00:00 sh
9026 pts/0 00:00:00 ps
sh: 1: pause: not found