精华内容
下载资源
问答
  • Linux C程序修改进程名称

    千次阅读 多人点赞 2021-05-12 22:13:26
    Linux C程序修改进程名称(通过修改argv[0])1、前言2、命令行参数(argc, argv)以及环境变量(environ)介绍2.1、C程序典型的存储空间布局2.2、argc, argv介绍2.3、environ介绍2.4、编写程序验证修改进程名是否可以...

    1、前言

    Linux C程序运行时,进程的名称通常就是argv[0],而通过修改内存中argv[0]存储的内容就可以修改进程名了。下面对此作详细介绍。

    2、命令行参数(argc, argv)以及环境变量(environ)介绍

    2.1、C程序典型的存储空间布局

    如图所示,是C程序典型的存储空间布局,可以很明显看到命令行参数环境变量处在最顶端,而且是挨在一起的,命令行参数后面紧接着就是环境变量,具体的内容大家可以自行看一下《UNIX环境高级编程》第七章,下图也是从里面摘录出来的
    在这里插入图片描述

    2.2、argc, argv介绍

    每个C语言程序都必须有一个称为main的函数,一般形式为int main(int argc, char* argc[]),改函数作为程序启动的起点。执行程序时,命令行参数通过argcargv这两个两个入参传递给main函数。第一个表示命令行参数的个数,而第二个参数则是一个指向命令行参数的指针数组,每一参数都是C类型字符串,以空字符\0结尾的,而最后一个参数argc[argv]则是一个空指针NULL。其中第一个字符串(argv[0]),则是该程序的名称,也就是运行时的进程名。

    内存示例如图所示
    在这里插入图片描述

    2.3、environ介绍

    每一个进程都有与其相关的称为环境列表(environment list)的字符串数组。其中每个字符串都以名称=值(name=value)形式定义。新进程在创建时,会继承其父进程的环境副本,子进程创建后,父、子进程均可更改各自的环境变量,且这些变更对对方而言不再可见。
    在C程序中,可以使用全局变量extern char** environ获取环境变量表(C运行时启动代码定义了该变量并以当前环境列表位置为其赋值)environargv参数比较相似,是一个指针数组,数组每个成员指向C类型字符串,最后一个指针也是一个NULL

    内存示例如图所示
    在这里插入图片描述

    2.4、编写程序验证修改进程名是否可以成功

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    
    int main(int argc, char* argv[])
    {
        sleep(8);
        strcpy(argv[0], "112233445566");
        while (1);                                                                                                           
     
        return 0;
    }
    

    代码如上,可以看到,程序先休眠8秒钟,然后修改argv[0]的值,编译运行一下,运行结果如下,可以看到,一开始进程名是./all,8秒后就变成了112233445566,修改成功,而且我们也能看出一点细节,那就是修改后的进程名超过了原先的进程名也没有报错,有可能的原因是argc[0]后面的内存也是可用的(其实从内存布局就可以看出来可用了)
    在这里插入图片描述

    2.5、查看进程名变长之后影响了那部分内存的数据

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    
    extern char** environ;
    
    int main(int argc, char* argv[])
    {
        printf("begin environ:\n");
        for (int i = 0; environ[i] != NULL && i < 5; i++)
            printf("%s\n", environ[i]);
    
        sleep(5);
        strcpy(argv[0], "112233445566");
        printf("\n\n");
    
        printf("end environ:\n");
        for (int i = 0; environ[i] != NULL && i < 5; i++)
            printf("%s\n", environ[i]);
    
        return 0;
    }
    

    代码如上,为了方便显示,环境变量只打印前五个,看看效果就行。运行结果如下图所示,可以看到,一开始打印的第一个环境变量为XDG_SESSION_ID=3585,当修改完进程名之后,该变量变为445566,原先进程名为./all,加上结束符是6个字节,剩余四个字节的内容也就是445566刚好把第一个环境变量的内存给覆盖了(这里没有传入参数,所以覆盖的是环境变量的内存)。
    在这里插入图片描述

    2.6、结论

    Linux C程序中传入参数和环境变量是存放在一段连续的内存空间的,而argvenviron这两个指针数组里面存放的指针就是指向这些内存的

    3、Redis修改进程名的做法

    Redis作为一个优秀的企业级存储框架,里面有许多值得学习的地方,而里面也有一段代码修改进程名的,接下来看看Redis是如何实现的

    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;
    
    void spt_init(int argc, char *argv[]) {
        char **envp = environ;
    	char *base, *end, *nul, *tmp;
    	int i, error, envc;
    
    	if (!(base = argv[0]))
    		return;
    
    	nul = &base[strlen(base)];
    	end = nul + 1;
    
    	for (i = 0; i < argc || (i >= argc && argv[i]); i++) {
    		if (!argv[i] || argv[i] < end)
    			continue;
    
    		if (end >= argv[i] && end <= argv[i] + strlen(argv[i]))
    			end = argv[i] + strlen(argv[i]) + 1;
    	}
    
    	for (i = 0; envp[i]; i++) {
    		if (envp[i] < end)
    			continue;
    
    		if (end >= envp[i] && end <= envp[i] + strlen(envp[i]))
    			end = envp[i] + strlen(envp[i]) + 1;
    	}
    	envc = i;
    
    	if (!(SPT.arg0 = strdup(argv[0])))
    		goto syerr;
    
    	if (!(tmp = strdup(program_invocation_name)))
    		goto syerr;
    
    	program_invocation_name = tmp;
    
    	if (!(tmp = strdup(program_invocation_short_name)))
    		goto syerr;
    
    	program_invocation_short_name = tmp;
    
        /* Now make a full deep copy of the environment and argv[] */
    	if ((error = spt_copyenv(envc, 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;
    }
    

    从代码中可以看出以下几点:

    1. base指向的是argv[0]nul指向argv[1],而end经过两个for循环遍历之后指向的是传入参数+环境变量内存空间的最末尾
    2. 使用strdup函数将原本的进程名复制给SPT.arg0
    3. spt_copyenvspt_copyargs函数的作用是将原先的传入参数(从argv[1]开始)和环境变量复制到一个新的内存区域,然后原先的指针数组里元素指向新的内存地址,完成了数据的迁移
    4. 经过上面的步骤之后,argv[0]还是指向原来的地址,而其他的传入参数以及环境变量均指向新的内存空间了,现在就可以任意修改进程名而不影响其他数据了

    4、总结

    本文介绍了如何修改Linux C程序的进程名,以及Redis源代码中是如何在保持原有传入参数以及环境变量的情况下,对程序的进程名进行修改。测试代码比较简单,大家可以自行编写程序去进行测试验证

    展开全文
  • 1. 修改工程(apk名称) 在弹出的对话框中输入新名称 该操作实际上是修改/.project下的节点。但由于某种原因,只修改该文件的话,在adt-bundle中,显示的工程名称仍然为老名称,只是apk的名称变为了新名称,因此...

    在Google提供的Eclipse集成开发环境adt-bundle下修改名称的总结:

    1.      修改工程名(apk名称)

    在弹出的对话框中输入新名称

    该操作实际上是修改<project>/.project下的<name>节点。但由于某种原因,只修改该文件的话,在adt-bundle中,显示的工程名称仍然为老名称,只是apk的名称变为了新名称,因此建议通过“重构”的方式为工程改名。

     

    2.      修改手机上<桌面名称>

    3.      修改在手机上的安装路径

    a)        修改源代码中主package的名称

    在弹出的对话框中输入新名字

     

    b)        修改AndroidManifest.xml中<manifest package=”<新package>”

    修改文件后,点保存,在随后弹出的对话框中点击<是>。

    Manifest.xml 中
    <manifest>标签中package属性用于设置应用程序的进程名,即在运行时使用ddms查看到的进程名。同时也是gen目录下R.id, R.layout所在的包名。
    <original-package>标签用以设置应用源码包名,即Java文件所在的源码程序包层次,android工程中真实的源代码层次结构。
    <manifest>中package属性若与<original-package>的android:name值相同,配置组建时android:name属性值可以使用".ClassName"形式。
    使用<original-package>标签后,在<activity><service><receiver><provider>中的android:name属性需要写完整的报名,".ClassName"形式无效。

    注意:<manifest>标签中package属性只是告诉系统应用的进程名;因此进程名(Manifest中package属性的值)与<original-package>的值可以不一样。

     

    c)        修改源代码中所有使用<package>.R.*的地方

    改为

     

    展开全文
  • 修改当前程序文件名,命令:ren 旧文件名新文件名 删除旧文件,命令:del /q /f 旧文件名程序全路径 启动新的程序,命令:start {3} 新文件名程序全路径 3、运行bat文件 先看一下效果图: 批处理工具类:...

    实现原理:

    1、获取当前程序的进程名称

    2、创建批处理bat文件,批处理bat文件一共实现四个功能:

    • 杀死当前进程,命令: taskkill /f /im 当前进程名称
    • 修改当前程序文件名,命令:ren 旧文件名 新文件名
    • 删除旧文件,命令:del /q /f 旧文件名程序全路径
    • 启动新的程序,命令:start {3} 新文件名程序全路径

    3、运行bat文件 

    先看一下效果图:

    批处理工具类:BatUtils.cs

    /// <summary>
        /// 批处理工具类
        /// </summary>
        class BatUtils
        {
            /// <summary>
            /// 写入bat文件
            /// </summary>
            /// <param name="fileContent"></param>
            /// <param name="filePath"></param>
            public static void writeBATFile(string fileContent, string filePath)
            {
                FileStream fs1 = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write);//创建写入文件
                StreamWriter sw = new StreamWriter(fs1, Encoding.GetEncoding("GB2312"));
                sw.WriteLine(fileContent);//开始写入值
                sw.Close();
                fs1.Close();
            }
            /// <summary>
            /// 执行bat文件
            /// </summary>
            /// <param name="filePath">所在目录</param>
            /// <param name="fileName">文件名</param>
            public static bool runBATFile(string filePath, string fileName)
            {
                bool flag = false;
                Process proc = null;
                try
                {
                    string targetDir = string.Format(filePath);
                    proc = new Process();
                    proc.StartInfo.WorkingDirectory = targetDir;
                    proc.StartInfo.FileName = fileName;
                    proc.StartInfo.Arguments = string.Format("10");
                    proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;//这里设置DOS窗口不显示
                    proc.Start();
                    proc.WaitForExit();
                    proc.Close();
                    flag = true;
                }
                catch (Exception ex)
                {
                    flag = false;
                    Console.WriteLine("Exception Occurred :{0},{1}", ex.Message, ex.StackTrace.ToString());
                }
                return flag;
            }
            /// <summary>
            /// 运行cmd命令
            /// </summary>
            /// <param name="command"></param>
            public static void RunCmd(string command)
            {
                //不管命令是否成功均执行exit命令,否则当调用ReadToEnd()方法时,会处于假死状态
                //command = command.Trim().TrimEnd('&') + "&exit";
                using (Process p = new Process())
                {
                    p.StartInfo.FileName = "cmd.exe";
                    //是否使用操作系统shell启动
                    p.StartInfo.UseShellExecute = false;
                    //接受来自调用程序的输入信息
                    p.StartInfo.RedirectStandardInput = true;
                    //输出信息
                    p.StartInfo.RedirectStandardOutput = true;
                    //输出错误
                    p.StartInfo.RedirectStandardError = true;
                    //不显示程序窗口
                    p.StartInfo.CreateNoWindow = true;
                    //启动程序
                    p.Start();
                    //向cmd窗口发送输入信息
                    p.StandardInput.AutoFlush = true;
                    p.StandardInput.WriteLine(command);
                    //获取cmd窗口的输出信息
                    //string output = p.StandardOutput.ReadToEnd();
                    p.WaitForExit();//等待程序执行完退出进程
                    p.Close();
                }
            }
        }

    Form1窗体代码:

     public partial class Form1 : Form
        {
            private string processName;//当前程序进程名
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                //获取当前进程名称
                Process cur = Process.GetCurrentProcess();
                processName = cur.ProcessName;
                this.Text = processName;
            }
    
            private void btnSave_Click(object sender, EventArgs e)
            {
                string appName = txtAppName.Text.Trim();
                if (appName == string.Empty)
                {
                    MessageBox.Show("请输入程序名称");
                    return;
                }
                if (!appName.Contains(".exe"))
                    appName += ".exe";
                string newFilePath = Environment.CurrentDirectory + "//" + appName;
                //正在运行的程序路径和文件名
                string oldFilePath = Application.ExecutablePath;
                string appBat = String.Format(@"
                @echo off
                taskkill /f /im {0}
                ren {0} {1}
                del /q /f {2} 
                start {3}", processName+".exe", appName, oldFilePath, newFilePath);
                BatUtils.writeBATFile(appBat, "修改进程名.bat");
                //隐藏文件          
                FileInfo fi = new FileInfo(Environment.CurrentDirectory + "\\修改进程名.bat");
                fi.Attributes = fi.Attributes | FileAttributes.Hidden;
                if (File.Exists("修改进程名.bat"))
                {
                    BatUtils.runBATFile(Environment.CurrentDirectory, "修改进程名.bat");
                }
            }
    
        }

     

    展开全文
  • 今天偶然发现,校园网的客户端的进程命名方式和正常的程序不一样,不仅不是按程序名的命名的,而且每次重新启动都不一样,如图 ![图片说明](https://img-ask.csdn.net/upload/201705/02/1493720584_534592.png) !...
  • python修改进程名

    2020-12-09 19:25:09
    一般情况下,我们直接启动python程序后使用ps查看,显示的结果为pyton xxx.py,web类应用使用netstat或ss查看显示为python。...setproctitle.setproctitle("进程别名") 导入模块,在程序的入口设置就好了。 .

    一般情况下,我们直接启动python程序后使用ps查看,显示的结果为pyton xxx.py,web类应用使用netstat或ss查看显示为python。 太不个性,太一般,很普通,也不太好管理。 我们可以借助第三方库setproctitle来解决这个问题。

    这次是使用top查看后台进程,发现有些Python进程总是关不掉,如果按照Python名去关闭,又容易误关其他软件,所以想给自己的代码进程命名,根据自己命名去关闭进程。

    一、安装

    pip install setproctitle

    或者下载源码安装。

    二、使用

    import setproctitle
    setproctitle.setproctitle("进程别名")

    导入模块,在程序的入口设置就好了,程序的入口可以是import那部分,在入口或是开启新进程的文件import部分加入上面代码。

    展开全文
  • java修改tomcat进程名字

    千次阅读 2013-10-21 15:47:38
    当同一个服务器上启动多个tomcat后,我们会在任务管理器中看见多个java.exe,当我们需要对某个tomcat进行监控时,却无法区分出该tomcat的进程,那么如何修改进程名呢?  打开tomcat_home\bin\setclasspath.bat文件...
  • 驱动程序的加载函数DriverEntry是运行在System进程中的.通过PsGetCurrentProcess可以...得到进程名在EPROCESS结构的偏移后,以后的进程调用驱动的时候,就可以直接在该偏移处获取当前进程名.代码如下: DWORD Get
  • linux修改进程的名字

    千次阅读 2018-04-20 10:57:00
    1 修改linux进程名字的基本原理 linux进程以argv[0]作为进程的名字,因此只需要修改argv[0]处的字符串就修改了linux进程的名字。 2 直接修改argv[0]会导致的问题 如果名字过程的话,argv[0]放不下了,就会踩后面...
  • 而通过 ps 命令就会获取多个进程名为 python 的 PID,通过 kill 命令会杀死获取到的所有进程,这并不是期望的事情。《Linux/macOS 获取进程PID、杀死进程》  只想杀死某一个进程名为python的进程,
  • shell脚本实现关闭指定程序名进程

    万次阅读 2017-08-16 15:23:49
    shell脚本实现关闭指定程序名进程 1、 基础篇 在Linux系统下,我们进行程序调试或者是进行应用程序升级时,经常需要先对我们的目标程序进行kill关闭。此时最基础的办法就是先查找到目标进程的PID,然后再执行...
  • linuxc修改进程名

    千次阅读 2018-11-15 17:37:54
    每一个c程序都有个main函数,作为程序启动入口函数。main函数的原型是int main(int argc , char *argv[]);其中argc表示命令行参数的个数;argv是一个指针数组,保存所有命令行字符串。Linux进程名称是通过命令行参数...
  • status文件,第一行的Name即为进程名,C程序实现根据PID获取进程名和根据进程名获取PID,大家参考使用吧
  • 进程程序替换 1. 进程创建 1.1 fork 在Linux中,我们通常使用fork函数来为一个已经存在的进程创建一个新进程。而这个新创建出来的进程被称为原进程的子进程,原进程被称为该进程的父进程。 该函数其实是一个系统...
  • 偶尔看到一段代码,是修改进程名的,觉得不对,遂网上查之。结果如下: 介绍: 每一个c程序都有个main函数,作为程序启动入口函数。main函数的原型是int main(int argc , char *argv[]);其中argc表示命令行参数...
  • C++ vc程序 进程优先级设置

    千次阅读 2020-06-16 09:57:05
    #include <windows.h> SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
  • 程序进程,线程的区别和联系

    万次阅读 多人点赞 2018-08-26 22:27:18
    进程程序区别和联系表现在以下方面: 1)程序只是一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体。而进程则不同,它是程序在某个数据集上的执行。进程是一个动态的实体,它有自己的生命周期...
  • 程序进程 程序:是指编译好的二进制文件,存放在磁盘上,并不占用系统资源(系统资源包括CPU、内存、打开的文件、设备、锁…) 进程:是一个抽象的概念,与操作系统原理密切相关。进程是活跃的程序,占用系统资源...
  • C#写进程守护程序

    千次阅读 2017-03-03 22:01:07
    最近写了好多次进程守护程序,今天在这里总结一下。 用到的知识点: 1、在程序中启动进程, 2、写Windows服务, 3、以及在Windows服务中启动带界面的程序 关于第三点的问题,我在我的上一篇博客单独介绍了解决...
  • linux根据进程名杀死进程

    万次阅读 2018-07-12 19:45:02
    笔记:根据一个进程的名字或...ps -ef | grep 进程名/启动进程的命令 | grep -v grep | awk '{print $2}' | xargs kill -9 测试: 终端输入: sleep 200 & sleep 200 & ps -ef | grep sleep | grep -v ...
  • 进程守护程序

    热门讨论 2007-11-13 19:48:19
    这个Guarder.exe几乎可以守护所有exe程序: 功能: 1... 使用: 选择要守护的exe程序,保存,重新运行Guarder.exe,提示"监控...."既可. <br> 翻译: 修改language.ini即可 <br>包含源代码.
  • 针对之前的一篇博文进行更改,那里的代码确实不好用 直接上代码: [Files] ; 安装前判断进程,dll文件放在inno的安装目录中 Source: compiler:IsTask.dll; Flags: dontcopy noencryption [code] //安装前判断...
  • 修改指定进程环境块中的进程路径以及命令行信息,从而达到进程 伪装的效果。 获取进程的句柄 内联汇编获取peb 修改命令行和imagepath #include<windows.h> #include<winternl.h> BOOL ...
  • 修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现 的现象,并分析原因。 如果在程序中使用系统调用lockf(),来给每一个进程加锁,可以实现进程之间的互斥,观察并...
  • linux下监控进程程序

    2013-02-28 09:44:35
    (1)进程列表在一个configurationfile.txt文件中,进程名的格式又/n分隔,如下: chrome firefox ..... (2)通过飞信发送通知短信的前提是发送的对象必须是自己的飞信好友,发送的邮箱和手机号可以再程序中自行...
  • 当同一个服务器上启动多个tomcat后,我们会在任务管理器中看见多个java.exe,当我们需要对某个tomcat进行监控时,却无法区分出该tomcat的进程,那么如何修改进程名呢?  打开tomcat_home\bin\setclasspath.bat...
  • 进程

    万次阅读 2021-05-25 14:29:00
    文章目录进程一.什么是多任务二、实现多任务的方式:示例1 一般情况下执行唱歌、跳舞示例2 单线程执行函数示例3 多线程执行函数示例4多线程执行唱歌、跳舞1示例5多线程执行唱歌、跳舞2三、什么是进程1.什么是进程?2...
  • window,tomcat部署程序后 怎么查看tomcat占用端口是否启动 怎么查看程序的监听端口 怎么杀掉进程 怎么修改tomcat启动内存 怎么修改tomcat进度名称
  • 在一个安卓应用程序工程创建之初,包名就已经确定。包更多的是一个编译时概念。由android IDE自动生成的类,比如R、BuildConfig,都是以AndroidManifest.xml中定义的包来构造类名,譬如,包为...
  • linux(十四)程序进程的深入研究

    千次阅读 2021-05-12 09:51:25
    程序进程的关系 程序 保存在硬盘,光盘等介质中的可执行代码和数据 静态保存的代码 进程 在cpu及内存中运行的程序代码 动态执行的代码 父、子进程 每个程序可以创建一个或者多个进程 僵尸进程:占用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 795,225
精华内容 318,090
关键字:

修改程序进程名