要想远程执行服务器上的程序,使用socket调用popen函数是个不错的选择


popen使用FIFO管道执行外部程序。

#include <stdio.h>
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);

popen 通过type是r还是w确定command的输入/输出方向,r和w是相对command的管道而言的。

r表示command从管道中读入,w表示 command通过管道输出到它的stdout,popen返回FIFO管道的文件流指针。

pclose则用于使用结束后关闭这个指针。


写一个hello.c测试代码

#include <stdio.h> 
void main() 
{ 	
	printf("hello\n"); 
} 

执行gcc hello.c -o hello命令生成一个可执行文件:hello

在同一个目录下写一个popen的测试程序popen.c:


#include <stdio.h>

#define BUFSIZE 8192 

int execute(char *command,char *buf,int bufmax);

int main(int argc,char*argv[])
{
	int sn;
	char buf[BUFSIZE];

	sn=execute("./hello",buf,BUFSIZE); 

	printf("%s",buf); 

	return 1;
}

int execute(char* command,char* buf,int bufmax)
{
	FILE* fp;
	int i;

	if((fp=popen(command,"r"))==NULL){
		i=sprintf(buf,"error command line:%s \n",command);
	}else{
		i=0;
		while((buf[i]=fgetc(fp))!=EOF && i<bufmax-1)
			i++;
		pclose(fp);
	}
	buf[i]='\0';
	return i;
}

执行gcc popen.c -o popen命令生成一个可执行文件:popen

执行./popen命令,得到hello字符串。

 ---------------------------------------------------------------------------------------------------

写一个hello.sh脚本文件:

#!/bin/sh
#this shell test print a string : hello
echo -n $string "hello \n"  


将popen.c:的

sn=execute("./hello",buf,BUFSIZE);

改为

sn=execute("./hello.sh",buf,BUFSIZE);

间接执行脚本文件,同样可以得到hello字符串


 ---------------------------------------------------------------------------------------------------

有的可执行文件是带参数的,这样搞:

int main(int argc,char*argv[])
{
    int sn;
    char buf[BUFSIZE];
    
    char url[200];
    
    char exPara[300];

    sscanf("rtsp://admin:12345@192.168.0.64","%s",url);//test url参数

    sscanf("/home/administrator/live/live/testProgs/openRTSP","%s",exPara);//openrtsp 可执行文件位置

    strcat(exPara,"  ");

    strcat(exPara,url);

    printf("%s\n",exPara);

    sn=execute(exPara,buf,BUFSIZE);     

    printf("%s",buf);

    return 1;
}



Logo

更多推荐