求与SYSTEM命令类似,但不作为子进程执行的命令

netreptile 2007-10-09 03:45:59
如题
...全文
111 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
netreptile 2007-10-10
  • 打赏
  • 举报
回复
int main(int argc,char ** argv)
{
while(1)
{
int connfd;
pid_t childpid;
socklen_t clilen;
int read_count=0;
struct sockaddr_in cliaddr,servaddr;
static int process_count=0;

listenfd=socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
inet_pton(AF_INET,SERV_IP,&servaddr.sin_addr);

servaddr.sin_port=htons(SERV_PORT);
bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
if (listen(listenfd,LISTENQ)<0){
printf("%s\n","listen fail\n");
}else
printf("%s\n","listen ok\n");

/*安装信号处理器*/
if(signal(SIGINT,sig_int)==SIG_ERR)
{
printf("signal error\n");
return;
}

for(;;)
{
clilen=sizeof(cliaddr);
if((connfd=accept(listenfd,(struct sockaddr *)&cliaddr,&clilen))<0)
{
printf("accept fail\n");
if(errno==EINTR)
{
continue;
}
else
{
printf("%s\n","accept error\n");
break;
}
}
process(connfd);
close(connfd);
}
close(listenfd);
sleep(120);
}
}
这里我改成单进程了
netreptile 2007-10-10
  • 打赏
  • 举报
回复
我把程序贴出来吧
int process(int connfd)
{
printf("connect\n");
memset(recvBuf,0x0,sizeof(recvBuf));
memset(sendBuf,' ',sizeof(sendBuf));
if(readn(connfd,recvBuf,BUFFER_SIZE)<0)
{
return -1;
}
else
{
printf("recvBuf=%s\n",recvBuf);
char length[5];
char type[5];
memset(length,0x0,sizeof(length));
memset(type,0x0,sizeof(type));
sscanf(recvBuf,"%4c%4c",length,type);
disspace(length);
disspace(type);
if(strlen(recvBuf) != atoi(length))
{
memcpy(sendBuf,recvBuf,strlen(recvBuf));
memcpy(sendBuf+68,"无效的消息",strlen("无效的消息"));
writen(connfd,sendBuf,strlen(sendBuf));
return -1;
}
else
{
if(strcmp(type,"0001") == 0)
{
printf("查询进程\n");
char process_name[100];
memset(process_name,0x0,sizeof(process_name));
memcpy(process_name,recvBuf+8,60);
disspace(process_name);
char syscmd[256];
memset(syscmd,0x0,sizeof(syscmd));
sprintf(syscmd,"ps -ef|grep %s |grep -v grep|awk '{print $2}'",process_name);
FILE * fp;
fp=popen(syscmd,"r");
char process_id[256];
memset(process_id,0x0,sizeof(process_id));
memcpy(process_id,"-1",strlen("-1"));
char buf[256];
while(!feof(fp))
{
memset(buf,0x0,sizeof(buf));
fgets(buf,255,fp);
if(strlen(buf) > 4)
{
memset(process_id,0x0,sizeof(process_id));
memcpy(process_id,buf,strlen(buf));
process_id[strlen(process_id)-1] = '\0';
break;
}
}
pclose(fp);

memcpy(sendBuf,recvBuf,8);
memcpy(sendBuf+8,process_id,strlen(process_id));
memcpy(sendBuf+68,"\0",1);
printf("sendBuf=[%s][%d]\n",sendBuf,strlen(sendBuf));
writen(connfd,sendBuf,strlen(sendBuf)+1);
return 0;
}
else if(strcmp(type,"0002") == 0)
{

}
else if(strcmp(type,"0003") == 0)
{
printf("关闭进程\n");
char process_name[100];
memset(process_name,0x0,sizeof(process_name));
memcpy(process_name,recvBuf+8,60);
disspace(process_name);
char syscmd[256];
memset(syscmd,0x0,sizeof(syscmd));
sprintf(syscmd,"sh -x /home/whjf/monitor/shell/shut/%s.sh",process_name);
execl("/bin/sh", "sh", "-c", syscmd, (char *)0);
memcpy(sendBuf,recvBuf,8);
memcpy(sendBuf+8,"00",2);
memcpy(sendBuf+68,"\0",1);
writen(connfd,sendBuf,strlen(sendBuf)+1);
return 0;
}
else if(strcmp(type,"0004") == 0)
{
printf("启动进程\n");
char process_name[100];
memset(process_name,0x0,sizeof(process_name));
memcpy(process_name,recvBuf+8,60);
disspace(process_name);
char syscmd[256];
memset(syscmd,0x0,sizeof(syscmd));
sprintf(syscmd,"sh -x /home/whjf/monitor/shell/start/%s.sh",process_name);
execl("/bin/sh", "sh", "-c", syscmd, (char *)0);
memcpy(sendBuf,recvBuf,8);
memcpy(sendBuf+8,"00",2);
memcpy(sendBuf+68,"\0",1);
writen(connfd,sendBuf,strlen(sendBuf)+1);
return 0;
}
else if(strcmp(type,"0005") == 0)
{

}
else
{

}
}
}
}
iambic 2007-10-09
  • 打赏
  • 举报
回复
你的client怎么会占用server的9010端口?就算占用了重启server前把端口关了不就行了。
ForestDB 2007-10-09
  • 打赏
  • 举报
回复
try deamon
netreptile 2007-10-09
  • 打赏
  • 举报
回复
是这样的,我需要做一个监控程序。监控我的程序是否正常。我就在unix下做了一个server,端口为9010。然后在windows下做了client。程序的效果达到了,是可以监控程序是否正常,但是从客户端启动的程序都带有9010端口。所以服务器重启的时候发现9010端口已经被监听。我想解决这个问题。就发了上面的帖子。没有说清楚,对不起大家。
Wolf0403 2007-10-09
  • 打赏
  • 举报
回复
不在子进程中执行只能在当前进程中执行,那么 Unix/Linux 系统的 exec 族函数可以满足你的要求。但是,你的进程也就到此结束了。
CSDSQJBOYACCP_10 2007-10-09
  • 打赏
  • 举报
回复
什么啊!!!不知道!!!!
_石头_ 2007-10-09
  • 打赏
  • 举报
回复
什么意思?搂住想做什么?

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧