1.system
cpp
#include <stdlib.h>
int system(const char *command);
返回值:
成功,则返回进程的状态值;不能源码execl函数,返回127;失败返回-1;
不能成功运行分析文章:linux下system函数详解_linux system_遥_望的博客-CSDN博客
在linux系统下,system函数是execl函数的封装版
popen()函数较于system()函数的优势在于使用简单,popen()函数只返回两个值:成功 /失败
源码:
cpp
#include
#include
#include
#include
int system(const char * cmdstring)
{
pid_t pid;
int status;
if(cmdstring == NULL){
return (1);
}
if((pid = fork())<0){
status = -1;
}
else if(pid == 0){
execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
-exit(127); //子进程正常执行则不会执行此语句
}
else{
while(waitpid(pid, &status, 0) < 0){
if(errno != EINTER){
status = -1;
break;
}
}
}
return status;
}
在linux系统下,system函数是execl函数的封装版
文中的 "sh -c ps"
和我们所使用的"ps"
是完全等价的
例子代码:
cs
#include <stdio.h>
#include <stdlib.h>
int main()
{
system("ps");
printf("\n");
}
直接运行ps指令;
运行文件:
cpp
#include <stdio.h>
int main(int argc,char *argv[])
{
int i;
for(i=0;i<argc;i++){
printf("argv[%d]:%s\n",i,argv[i]);
}
return 0;
}
system运行:
cpp
#include <stdio.h>
#include <stdlib.h>
int main()
{
system("./test aa bb cc dd");
printf("\n");
}
结果:
argv[0]:./test //程序地址
argv[1]:aa //以下为程序参数
argv[2]:bb
argv[3]:cc
argv[4]:dd
还可以运行子进程中的其他程序:
在Linux文件编程中
写一个TEST.config文件:
SPEED=5
LENG=1
SCORE=90
LEVEL=95
对TEST.config文件内容进行修改,将LENG=1,改成LENG=5
代码:
cpp
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
int fdsrc;
char *readbuf=NULL;
if(argc!=2){
printf("pararm error\n");
exit(-1);//tuichugaichengxu
}
//打开文件,将文件复制到readbuf中
fdsrc=open(argv[1],O_RDWR);
int size=lseek(fdsrc,0,SEEK_END);
lseek(fdsrc,0,SEEK_SET);
readbuf=(char *)malloc(sizeof(char)*size+8);
int n_read=read(fdsrc,readbuf,size);
//找到readbuf中LENG=中的位置,将位置移动到1,替换为5
char *p=strstr(readbuf,"LENG=");
if(p==NULL){
printf("not found\n");
exit(-1);
}
p=p+strlen("LENG=");
*p='5';
//移动光标到文件头,重新将readbuf中的内容写入到打开的文件中
lseek(fdsrc,0,SEEK_SET);
int n_write=write(fdsrc,readbuf,strlen(readbuf));
close(fdsrc);
return 0;
}
编译:gcc demo13.c
运行:./a.out TEST.config
运行结果为:
SPEED=5
LENG=5
SCORE=90
LEVEL=95
system运用:
将上述代码编译为./changedata
cpp
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main()
{
pid_t pid;
int data=10;
while(1){
printf("please input a data\n");
scanf("%d",&data);
if(data==1){
pid=fork();
if(pid>0){
wait(NULL);
}
if(pid==0){
// execl("./changedata","changedata","config.txt",NULL);
system("./changedata config.txt");
exit(0);
}
}
else{
printf("wait,do nothing\n");
}
}
return 0;
}
cat config.txt
能够发现LENG=1变成了LENG=5
要注意的是,system运行完后,父进程还会继续向下运行,这点与execl函数不同。
2.popen函数
popen的使用:
#include <stdio.h>
FILE *popen(const chat *command, const char *type);
int pclose(FILE *stream);
command:是一个指向以NULL结束的shell命令字符串的指针。
type:只能是读或写的其中一种r/w
无法获得system的值,需要使用popen
代码:
cpp
#include <stdio.h>
int main()
{
char ret[500]={0};
FILE *fp;
fp = popen("ps","r");
int n_read = fread(ret,1,1024,fp);
printf("read ret = %d byte\n ret =\n %s\n",n_read,ret);
return 0;
}
结果:
当使用system时,ret的值无法读出,用popen函数;