所以我试图将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
所以无论如何我都可以从编译中更改进程名称,而无需进入代码。
答案 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
。如果你想改变它,只需更改可执行文件的名称,这应该不难。