Linux C:在编译期间更改进程名称

时间:2013-08-26 14:45:06

标签: c linux gcc

所以我试图将c程序的进程名称从crystal_capture更改为crystal_captured,它似乎想要保留旧的进程名称(crystal_capture)。

这是makefile。

CC=gcc
CFLAGS=-c -Wall
MSFLAGS=-lpcap -I/usr/include/mysql -DBIG_JOINS=1  -fno-strict-aliasing  -g -L/usr/lib/arm-linux-gnueabihf -lmysqlclient -lpthread -lz -lm -lrt -ldl
CAPTURE=crystal_captured

all: $(CAPTURE)

$(CAPTURE): parser.o $(CAPTURE).o
     $(CC) $(MSFLAGS) parser.o $(CAPTURE).o -o $@

$(CAPTURE).o: $(CAPTURE).cpp
    $(CC) $(CFLAGS) $(MSFLAGS) $(CAPTURE).cpp

parser.o: parser.c
    $(CC) $(CFLAGS) parser.c

clean:
    rm -rf *.o $(CAPTURE)

命令     make; sudo ./crystal_captured; ps -A | grep crystal

看到 crystal_capture

所以无论如何我都可以从编译中更改进程名称,而无需进入代码。

2 个答案:

答案 0 :(得分:4)

经过一些调试和一些帮助后,我终于搞清楚了。它没有做错什么只是截断我添加到名称上的'd'。

必须将其截断为最多15个字符

答案 1 :(得分:3)

您的makefile目标是$(NAME),但它会输出到/bin/$(NAME),因此将始终尝试重建目标。另外,写入/bin/意味着您要编译为root,不要这样做。您应该输出目标的名称:

$(NAME): $(NAME).o
     $(CC) $(CFLAGS) $(NAME).o -o $(NAME)

最简单的方法是使用引用目标的内置make变量:

$(NAME): $(NAME).o
     $(CC) $(CFLAGS) $(NAME).o -o $@

如果您希望目标位于/bin/(您不应该这样做),那么您可以这样做:

/bin/$(NAME): $(NAME).o
     $(CC) $(CFLAGS) $(NAME).o -o $@

但是目标名称和创建的文件仍应匹配,或者您对make撒谎。

您还可以使用引用第一个先决条件的内置变量:

$(NAME): $(NAME).o
     $(CC) $(CFLAGS) $< -o $@

你的makefile是没有意义的,给定program_name.c你可以编译一个没有makefile的简单程序,如下所示:

make CFLAGS=-Wall program_name

这将使用make的默认规则,使用program_name

program_name.c编译gcc

你还没有说出问题所在,所以我不知道它是否与$(NAME)/bin/$(NAME)之间的差异有关,但除非你重新解释这个问题,否则不可能弄清楚是什么你看到了,为什么你认为这是错误的。

除非进程改变argv[0],否则进程名称只是可执行文件的名称,因此如果执行/bin/foobar,则进程名称将为/bin/foobar。如果你想改变它,只需更改可执行文件的名称,这应该不难。