社区
C语言
帖子详情
求与SYSTEM命令类似,但不作为子进程执行的命令
netreptile
2007-10-09 03:45:59
如题
...全文
111
8
打赏
收藏
求与SYSTEM命令类似,但不作为子进程执行的命令
如题
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
什么意思?搂住想做什么?
IBM System 3650 M4服务器规划RAID安装win2008R2
本课程教你在IBM服务器上规划RAID和安装win2008R2,在维护IBM服务器的时候经常遇到RAID卡信息丢失,虽然多个硬盘做了RAID1或RAID5,一次断电 或不关机热插拔硬盘,导致系统无法正常启动,影响业务正常运行,同时硬盘...
linux启动进程 fork、exec系列与system、popen区别
1. system(”command”); 使用该
命令
将开启一个
子进程
执行
引号中的
命令
,父进程将等待
子进程
结束并继续
执行
下面的代码。 2. exec(”command”); 效果同system
命令
类似
,区别是不会开启
子进程
,而是取代父进程,因此
执行
完引号中的
命令
后进程即结束。一般和fork配合使用。 3. `command`; 使用反引号调用外部
命令
能够捕获其标准输出,并按行返回
利用python
执行
linux
命令
的几种方式和区别
本文介绍三种在python
执行
linux
命令
的方式,三种方式都是基于python的标准库实现,因此不需要额外安装第三方库。 os.system() os.system(cmd),其中cmd就是需要
执行
的linux
命令
。该方式会阻塞主进程,直到
命令
执行
结束并返回状态,如果返回的状态值为0,表示
命令
正常
执行
,如果不为0,则表示
命令
执行
异常。要注意的是,该方式
执行
linux
命令
,会直接打印出
命令
执行
的结果,但是不会作为对象返回,因此程序无法直接获取
命令
执行
的结果。 os.po...
python 运行shell
命令
的几种方法(os.system、os.popen、subprocess、commands)
1、os.system 该函数返回
命令
执行
结果的返回值,并不是返回
命令
的
执行
输出, system()函数在
执行
过程中进行了以下三步操作: 1.fork一个
子进程
; 2.在
子进程
中调用exec函数去
执行
命令
; 3.在父进程中调用wait(阻塞)去等待
子进程
结束。 对于fork失败,system()函数返回-1。 **** 用法示例 >>> os.system('ls -a')...
perl中调用Linux
命令
1. system(”command”);使用该
命令
将开启一个
子进程
执行
引号中的
命令
,父进程将等待
子进程
结束并继续
执行
下面的代码。2. exec(”command”);效果同system
命令
类似
,区别是不会开启
子进程
,而是取代父进程,因此
执行
完引号中的
命令
后进程即结束。一般和fork配合使用。3. `command`;使用反引号调用外部
命令
能够捕获其标准输出,并按行返回且每行结束处附带一个
C语言
69,374
社区成员
243,079
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章