Chinaunix

标题: 修改程序名称 [打印本页]

作者: msj0520    时间: 2009-11-24 16:33
标题: 修改程序名称
/* proctitle code - we know this to work only on linux... */
/*
**  SETPROCTITLE -- set process title for ps (from sendmail)
**
**      Parameters:
**              fmt -- a printf style format string.
**
**      Returns:
**              none.
**
**      Side Effects:
**              Clobbers argv of our main procedure so ps(1) will
**              display the title.
*/
#include stdio.h>
#include stdlib.h>
#include string.h>
#include stdarg.h>
#include "setproctitle.h"
#ifndef SPT_BUFSIZE
#define SPT_BUFSIZE     2048
#endif
extern char** environ;
static char** argv0;
static int argv_lth;
void
initproctitle (int argc, char **argv) {
        int i;
        char **envp = environ;
        /*
         * Move the environment so we can reuse the memory.
         * (Code borrowed from sendmail.)
         * WARNING: ugly assumptions on memory layout here;
         *          if this ever causes problems, #undef DO_PS_FIDDLING
         */
        for (i = 0; envp != NULL; i++)
                continue;
        environ = (char **) malloc(sizeof(char *) * (i + 1));
        if (environ == NULL)
                return;
        for (i = 0; envp != NULL; i++)
                if ((environ = strdup(envp)) == NULL)
                        return;
        environ = NULL;
        argv0 = argv;
        if (i > 0)
                argv_lth = envp[i-1] + strlen(envp[i-1]) - argv0[0];
        else
                argv_lth = argv0[argc-1] + strlen(argv0[argc-1]) - argv0[0];
}       
#if 0
/* Nice code, but many places do not know about vsnprintf ... */
void
setproctitle (const char *fmt,...) {
        int        i;
        char       buf[SPT_BUFSIZE];
        va_list    ap;
        if (!argv0)
                return;
        va_start(ap, fmt);
        (void) vsnprintf(buf, SPT_BUFSIZE, fmt, ap);
        va_end(ap);
        i = strlen (buf);
        if (i > argv_lth - 2) {
                i = argv_lth - 2;
                buf = '\0';
        }
        memset(argv0[0], '\0', argv_lth);       /* clear the memory area */
        (void) strcpy (argv0[0], buf);
        argv0[1] = NULL;
}
#else
void
setproctitle (const char *prog, const char *txt) {
        int        i;
        char       buf[SPT_BUFSIZE];
        if (!argv0)
                return;
        if (strlen(prog) + strlen(txt) + 5 > SPT_BUFSIZE)
                return;
        (void) sprintf(buf, "%s -- %s", prog, txt);
        i = strlen (buf);
        if (i > argv_lth - 2) {
                i = argv_lth - 2;
                buf = '\0';
        }
        memset(argv0[0], '\0', argv_lth);       /* clear the memory area */
        (void) strcpy (argv0[0], buf);
        argv0[1] = NULL;
}
#endif
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/17928/showart_2102645.html




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2