使用popen函数和ps命令读取进程表_ps基本操作流程命令

2020-02-29 其他范文 下载本文

使用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;}

《使用popen函数和ps命令读取进程表.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
使用popen函数和ps命令读取进程表
点击下载文档
相关专题 ps基本操作流程命令 命令 函数 进程 ps基本操作流程命令 命令 函数 进程
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文