3199|1

888

帖子

3

TA的资源

五彩晶圆(初级)

楼主
 

linux C语言 修改进程名称 [复制链接]

下面主要介绍了Linux下C语言修改进程名称的方法,涉及Linux下使用C语言操作进程的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下;


本文实例讲述了Linux下C语言修改进程名称的方法。分享给大家供大家参考。具体如下:



main.c

#include
#include
#include "setproctitle.c"


int main(int argc, char **argv)
{
    spt_init(argc,argv);
    setproctitle("new_name_process");
    sleep(1000);
    return 0;
}




setproctitle.c

/* ==========================================================================
* setproctitle.c - Linux/Darwin setproctitle.
* --------------------------------------------------------------------------
* Copyright (C) 2010  William Ahern
* Copyright (C) 2013  Salvatore Sanfilippo
* Copyright (C) 2013  Stam He
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to permit
* persons to whom the Software is furnished to do so, subject to the
* following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
* NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
* USE OR OTHER DEALINGS IN THE SOFTWARE.
* ==========================================================================
*/
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif


#include    /* NULL size_t */
#include    /* va_list va_start va_end */
#include    /* malloc(3) setenv(3) clearenv(3) setproctitle(3) getprogname(3) */
#include     /* vsnprintf(3) snprintf(3) */


#include    /* strlen(3) strchr(3) strdup(3) memset(3) memcpy(3) */


#include     /* errno program_invocation_name program_invocation_short_name */


#if !defined(HAVE_SETPROCTITLE)
#define HAVE_SETPROCTITLE (defined __NetBSD__ || defined __FreeBSD__ || defined __OpenBSD__)
#endif




#if !HAVE_SETPROCTITLE
#if (defined __linux || defined __APPLE__)


extern char **environ;


static struct {
    /* original value */
    const char *arg0;


    /* title space available */
    char *base, *end;


     /* pointer to original nul character within base */
    char *nul;


    _Bool reset;
    int error;
} SPT;




#ifndef SPT_MIN
#define SPT_MIN(a, b) (((a) < (b))? (a) : (b))
#endif


static inline size_t spt_min(size_t a, size_t b);
static int spt_clearenv(void);
static int spt_copyenv(char *oldenv[]);


static int spt_copyargs(int argc, char *argv[]) ;
void spt_init(int argc, char *argv[]);
void setproctitle(const char *fmt, ...);




static inline size_t spt_min(size_t a, size_t b) {
    return SPT_MIN(a, b);
} /* spt_min() */




/*
* For discussion on the portability of the various methods, see
* http://lists.freebsd.org/pipermail/freebsd-stable/2008-June/043136.html
*/
static int spt_clearenv(void) {
#if __GLIBC__
    clearenv();


    return 0;
#else
    extern char **environ;
    static char **tmp;


    if (!(tmp = malloc(sizeof *tmp)))
        return errno;


    tmp[0]  = NULL;
    environ = tmp;


    return 0;
#endif
} /* spt_clearenv() */




static int spt_copyenv(char *oldenv[]) {
    extern char **environ;
    char *eq;
    int i, error;


    if (environ != oldenv)
        return 0;


    if ((error = spt_clearenv()))
        goto error;


    for (i = 0; oldenv; i++) {
        if (!(eq = strchr(oldenv, '=')))
            continue;


        *eq = '\0';
        error = (0 != setenv(oldenv, eq + 1, 1))? errno : 0;
        *eq = '=';


        if (error)
            goto error;
    }


    return 0;
error:
    environ = oldenv;


    return error;
} /* spt_copyenv() */




static int spt_copyargs(int argc, char *argv[]) {
    char *tmp;
    int i;


    for (i = 1; i < argc || (i >= argc && argv); i++) {
        if (!argv)
            continue;


        if (!(tmp = strdup(argv)))
            return errno;


        argv = tmp;
    }


    return 0;
} /* spt_copyargs() */




void spt_init(int argc, char *argv[]) {
    char **envp = environ;
    char *base, *end, *nul, *tmp;
    int i, error;


    if (!(base = argv[0]))
        return;


    nul = &base[strlen(base)];
    end = nul + 1;


    for (i = 0; i < argc || (i >= argc && argv); i++) {
        if (!argv || argv < end)
            continue;


        end = argv + strlen(argv) + 1;
    }


    for (i = 0; envp; i++) {
        if (envp < end)
            continue;


        end = envp + strlen(envp) + 1;
    }


    if (!(SPT.arg0 = strdup(argv[0])))
        goto syerr;






    if ((error = spt_copyenv(envp)))
        goto error;


    if ((error = spt_copyargs(argc, argv)))
        goto error;


    SPT.nul  = nul;
    SPT.base = base;
    SPT.end  = end;


    return;
syerr:
    error = errno;
error:
    SPT.error = error;
} /* spt_init() */




#ifndef SPT_MAXTITLE
#define SPT_MAXTITLE 255
#endif


void setproctitle(const char *fmt, ...) {
    char buf[SPT_MAXTITLE + 1]; /* use buffer in case argv[0] is passed */
    va_list ap;
    char *nul;
    int len, error;


    if (!SPT.base)
        return;


    if (fmt) {
        va_start(ap, fmt);
        len = vsnprintf(buf, sizeof buf, fmt, ap);
        va_end(ap);
    } else {
        len = snprintf(buf, sizeof buf, "%s", SPT.arg0);
    }


    if (len <= 0)
        { error = errno; goto error; }


    if (!SPT.reset) {
        memset(SPT.base, 0, SPT.end - SPT.base);
        SPT.reset = 1;
    } else {
        memset(SPT.base, 0, spt_min(sizeof buf, SPT.end - SPT.base));
    }


    len = spt_min(len, spt_min(sizeof buf, SPT.end - SPT.base) - 1);
    memcpy(SPT.base, buf, len);
    nul = &SPT.base[len];


    if (nul < SPT.nul) {
        *SPT.nul = '.';
    } else if (nul == SPT.nul && &nul[1] < SPT.end) {
        *SPT.nul = ' ';
        *++nul = '\0';
    }


    return;
error:
    SPT.error = error;
} /* setproctitle() */




#endif /* __linux || __APPLE__ */
#endif /* !HAVE_SETPROCTITLE */






最新回复

直接改可执行文件名就可以啊,一般shell下运行的进程名就是可执行文件名  详情 回复 发表于 2016-1-11 09:54
点赞 关注
个人签名邮箱:ternence.hsu@foxmail.com
 

回复
举报

3

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
直接改可执行文件名就可以啊,一般shell下运行的进程名就是可执行文件名
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表