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

Linux popen函数的使用总结

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的修改和recreatevg命令的使用

Pvid是aix系统中的ODM LVM用于识别PV的序列号,操作系统通过pvid来识别pv,就好像我们每个人的ID card。当pv被添加到系统中之后,可以通过两种方式生成pvid 1,cfgmgr –v 2,lspv 如......

clc和clear命令的使用总结

clc和clear命令的使用总结在MATLAB中,clc和clear命令是大家经常用到的命令,熟练使用这两个命令可为编程提供很大的方便。clc命令是用来清除命令窗口的内容,这点不用多说。不管......

届毕业生就业工作实施方案和就业工作进程表

武汉大学珞珈学院2014届毕业生就业工作实施方案一、指导思想认真贯彻各级有关做好普通高校毕业生就业工作的精神,不断完善院系两级就业工作体系,优化学科专业结构,强化学生实践......

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