使用popen函数和ps命令读取进程表_ps基本操作流程命令
使用popen函数和ps命令读取进程表由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“ps基本操作流程命令”。
使用popen函数和ps命令读取进程表
#include /* FILE, sprintf, fgets, puts */ #include /* atoi, exit, EXIT_SUCCESS */ #include /* strtok, strcmp */ #include /* pid_t */ #include /* WIFEXITED, WEXITSTATUS */
char *procname(pid_t pid){ static char line[133], command[80], *linep, *token, *cmd;FILE *fp;int status;
if(0 == pid)return(char *)0;
sprintf(command, “ps-p %d 2>/dev/null”, pid);fp = popen(command, “r”);if((FILE *)0 == fp)return(char *)0;
/* 读取标题行 */ if((char *)0 == fgets(line, sizeof line, fp)){ pclose(fp);return(char *)0;}
/* 从标题栏分析出命令名所在列。
*(BSD风格的系统将指示命令的“COMMAND”字符串放在第5列,SysV好象将 * 指示命令的“CMD”或“COMMAND”字符串放在第4列)*/ for(linep = line;;linep =(char *)0){ if((char *)0 ==(token = strtok(linep, “ tn”))){ pclose(fp);return(char *)0;} if(0 == strcmp(“COMMAND”, token)|| 0 == strcmp(“CMD”, token)){ /* 我们找到COMMAND所在列 */ cmd = token;break;} }
/* 读取 ps(1)输出行 */ if((char *)0 == fgets(line, sizeof line, fp)){ pclose(fp);return(char *)0;}
/* 抓COMMAND标题下面的词...*/ if((char *)0 ==(token = strtok(cmd, “ tn”))){ pclose(fp);return(char *)0;} status = pclose(fp);if(!WIFEXITED(status)|| 0!= WEXITSTATUS(status))return(char *)0;
return token;}
int main(int argc, char *argv[]){ puts(procname(atoi(argv[1])));exit(EXIT_SUCCESS);}
守护程序工具函数 ================
#include #include #include #include #include #include #include
/* closeall()--关闭所有>=给定值的文件描述符 */
void closeall(int fd){ int fdlimit = sysconf(_SC_OPEN_MAX);while(fd
/* daemon()-将进程从用户端脱离并消失进入后台,若失败返回-1,* 但是在那种情况下你只能退出,因为我们可能已经生成了子进程。* 这是基于BSD的版本,所以调用方需负责类似umask等等其它的工作。*/
/* 相信在所有Posix系统上都能工作 */
int daemon(int nochdir, int noclose){ switch(fork()){ case 0: break;case-1: return-1;default: _exit(0);/* 原进程退出 */ }
if(setsid()
/* 如果你希望将来获得一个控制tty,则排除(dyke)以下的switch语句 */ /*--正常情况不建议用于守护程序 */
switch(fork()){ case 0: break;case-1: return-1;default: _exit(0);}
if(!nochdir)chdir(“/”);
if(!noclose){ closeall(0);open(“/dev/null”,O_RDWR);dup(0);dup(0);}
return 0;}
/* fork2()--类似fork函数,但子进程立刻变成孤儿进程 *(当它退出时不产生僵死进程)* 返回1给父进程,不是任何有意义的进程号.* 父进程不能使用wait函数等待子进程结束(它们是无关的).*/
/* 这个版本假设你没有捕获和忽略SIGCHLD信号.*/ /* 如果你有设定,则不管怎样应使用fork函数 */
int fork2(){ pid_t pid;int rc;int status;
if(!(pid = fork())){ switch(fork()){ case 0: return 0;case-1: _exit(errno);/* 假设错误码都小于256 */ default: _exit(0);} }
if(pid
if(WIFEXITED(status))if(WEXITSTATUS(status)== 0)return 1;else errno = WEXITSTATUS(status);else errno = EINTR;/* 唉,类似这个 :-)*/
return-1;}
一个使用以上函数的范例程序:
#include #include #include #include #include #include #include
int daemon(int,int);int fork2(void);void closeall(int);
#define TCP_PORT 8888
void errexit(const char *str){ syslog(LOG_INFO, “%s failed: %d(%m)”, str, errno);exit(1);}
void errreport(const char *str){ syslog(LOG_INFO, “%s failed: %d(%m)”, str, errno);}
/* 实际的子进程在此.*/
void run_child(int sock){ FILE *in = fdopen(sock,“r”);FILE *out = fdopen(sock,“w”);int ch;setvbuf(in, NULL, _IOFBF, 1024);setvbuf(out, NULL, _IOLBF, 1024);
while((ch = fgetc(in))!= EOF)fputc(toupper(ch), out);
fclose(out);}
/* 这是守护程序的主要工作--侦听连接并生成子进程 */
void proce(){ struct sockaddr_in addr;int addrlen = sizeof(addr);int sock = socket(AF_INET, SOCK_STREAM, 0);int flag = 1;int rc = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag));
if(rc
addr.sin_family = AF_INET;addr.sin_port = htons(TCP_PORT);addr.sin_addr.s_addr = INADDR_ANY;
rc = bind(sock,(struct sockaddr *)&addr, addrlen);if(rc
rc = listen(sock, 5);if(rc
if(rc >= 0)switch(fork2()){ case 0: close(sock);run_child(rc);_exit(0);case-1: errreport(“fork2”);close(rc);break;default: close(rc);} } }
int main(){ if(daemon(0,0)
openlog(“test”, LOG_PID, LOG_DAEMON);
proce();
return 0;}
Linux popen函数的使用总结函数原型:#include “stdio.h”FILE *popen( const char* command, const char* mode )参数说明:command: 是一个指向以 NULL 结束的 shell 命令字符......
实验室四只MBUS水表,地址和抄表命令分别如下: 地址19:发:68 10 00 00 00 13 01 00 8C 16 答:68 10 00 00 00 13 81 03 34 37 34 AE 16 地址34:发:68 10 00 00 00 22 01 00 9B 16 答......
Pvid是aix系统中的ODM LVM用于识别PV的序列号,操作系统通过pvid来识别pv,就好像我们每个人的ID card。当pv被添加到系统中之后,可以通过两种方式生成pvid 1,cfgmgr –v 2,lspv 如......
clc和clear命令的使用总结在MATLAB中,clc和clear命令是大家经常用到的命令,熟练使用这两个命令可为编程提供很大的方便。clc命令是用来清除命令窗口的内容,这点不用多说。不管......
武汉大学珞珈学院2014届毕业生就业工作实施方案一、指导思想认真贯彻各级有关做好普通高校毕业生就业工作的精神,不断完善院系两级就业工作体系,优化学科专业结构,强化学生实践......
