我正在尝试运行一个测试程序,它将显示所请求的pid的过程。如果未插入pid,则假设获得pid 1的进程,即init。不知何故,当我在hp-ux itanium上运行它时,它无法显示进程。这只发生在pp 1的hp-ux itanium上。对于其他pid和平台,它工作得很好。以下是我认为相关的代码:
这是测试文件
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include "procname.h"
int main(int argc, char **argv)
{
pid_t pid;
char proc[PROCNAME_SZ];
if (argc==2) {
pid = atoi(argv[1]);
if (pid<1) {
printf("Invalid pid\n");
exit(1);
}
} else {
pid = 1;
}
if (get_procname(pid, proc, sizeof(proc))!=0) {
printf("Error retrieving process name: %s\n", strerror(errno));
printf("proc = %s\n",proc);
printf("pid is = %d\n",pid);
exit(1);
}
if (argc==2) {
printf("Process name = %s\n", proc);
} else {
printf("Checking if procname(1) have init...");
if (strstr(proc, "init")) {
printf("OK (%s)\n", proc);
exit(0);
} else {
printf("Failed (%s)\n", proc);
exit(1);
}
}
return 0;
}
这是.c文件
#include <errno.h>
#include "procname.h"
#include "log.h"
#ifdef HPUX
# include <sys/param.h>
# include <sys/pstat.h>
# include <sys/unistd.h>
#endif
int get_procname(pid_t pid, char *buf, size_t n)
{
#ifdef HPUX
struct pst_status pst;
if (pstat_getproc(&pst, sizeof(pst), (size_t)0, pid) != -1) {
memcpy(buf, pst.pst_cmd, n - 1);
buf[n-1] = 0;
} else {
return -1;
}
#endif
return 0;
}
这是我在hp-ux itanium上的输出:
./test_procname 1
Error retrieving process name: Value too large to be stored in data type
proc =
pid is = 1
这是我加入hp-uxmp
的结果./test_procname 1
Process name = init
pid是一样的,但不知何故它无法识别hp-ux itanium上的init。打印字符串的大小足以打印init。