社区
C语言
帖子详情
求与SYSTEM命令类似,但不作为子进程执行的命令
netreptile
2007-10-09 03:45:59
如题
...全文
150
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
打赏
举报
回复
什么意思?搂住想做什么?
system()
执行
shell
命令
本文详细解析了system()函数的工作原理及正确用法,包括通过clone()创建
子进程
、使用wait4()等待
子进程
结束,以及如何处理SIGCHLD信号。同时介绍了如何获取
命令
执行
状态并给出示例代码。
System函数与脚本的后台
执行
本文通过一个具体的故障报告介绍了Linux系统中System函数如何调用后台
执行
脚本的问题。System函数会创建
子进程
执行
命令
,而不会等待脚本
执行
完毕即返回,这可能导致并发问题。文中还探讨了fork()函数的工作原理以及system()源码解析。
linux
执行
命令
并获取结果(system)
本文详细介绍了mkstemp函数的使用方法及其在
执行
系统
命令
中的应用。mkstemp用于创建唯一临时文件,结合system函数扩展实现
命令
执行
并获取结果,同时处理信号避免影响
子进程
执行
。
C++中
执行
shell
命令
,popen与system的区别
popen是一个通过管道与
子进程
进行通信的函数,它创建管道、fork
子进程
并
执行
命令
,返回一个文件指针,可以进行读写操作。popen是非阻塞的,需要通过读写操作使其阻塞。而system函数
执行
外部
命令
并等待其完成,是阻塞的,其输出直接在终端显示。两者在处理
命令
执行
和进程通信上有不同方式。
system——
执行
指定
命令
或脚本
本文深入解析了C语言中system函数的工作原理及返回值处理,详细解释了如何判断shell脚本是否正常
执行
,包括创建
子进程
、调用shell
命令
及错误处理等关键步骤。
C语言
70,040
社区成员
243,245
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章