pstat_getproc在hp-ux itanium中返回pid 1的错误

时间:2013-12-03 08:40:52

标签: c linux init pid hp-ux

我正在尝试运行一个测试程序,它将显示所请求的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。

0 个答案:

没有答案