2013-08-26 78 views
1

期間更改進程名所以我想在C程序的進程的名稱從crystal_capture改變crystal_captured,它似乎是想保留舊的進程名(crystal_capture)。Linux下C:編譯

這裏是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 [email protected] 

$(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

那麼,有沒有反正我可以進程的名稱從編譯更改,而不必去到代碼。

+1

「這似乎是想要」很含糊。究竟發生了什麼,你會得到什麼輸出?例如,我希望在大多數系統上寫入'/ bin'會遇到權限問題。 – unwind

+1

這似乎沒問題。它應該產生/ bin/program_name如果你有權限寫在那裏(通常只有root可以做到這一點)。究竟發生了什麼? (儘管習慣上將可執行文件輸出到當前目錄,而是提供一個安裝目標,將可執行文件放在例如/ bin文件夾中) – nos

+0

@unwind @nos是的,我正在編譯爲bin。我將在未來創建一個安裝目標來實現這一目標,但目前它並不是真的需要。但無論如何,發生的一切都是在/ bin /中顯示一個新的可執行文件(使用新名稱)。但是,當我運行它,然後運行'ps -A'它會顯示出舊的進程名稱。 – dostrander

回答

4

一些調試和一些幫助,我終於弄明白了。它沒有做任何錯事,只是截斷了我添加到名稱上的'd'。

它必須是截斷到15個字符最多。

+0

運行'ps aux'或'ps -ef'而不是'ps -A',這樣你就可以看到整個程序名和更多。 – nos

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 [email protected] 

如果你想目標是在/bin/(你不應該這樣做),那麼你可以這樣做:

/bin/$(NAME): $(NAME).o 
    $(CC) $(CFLAGS) $(NAME).o -o [email protected] 

但目標名稱和創建仍應匹配文件,或者你在騙make

您還可以使用內置的,指的第一要義變量:

$(NAME): $(NAME).o 
    $(CC) $(CFLAGS) $< -o [email protected] 

你的Makefile是相當毫無意義,因爲program_name.c你可以編譯一個簡單的程序沒有一個makefile,像這樣:

make CFLAGS=-Wall program_name 

這將使用make的默認規則使用匯編從program_name.cprogram_namegcc

你還沒說是什麼問題,所以我不知道它是否$(NAME)/bin/$(NAME)之間的相關差異,但除非你改一下這個問題它不是真的有可能找出你所看到的,爲什麼你認爲這是錯誤的。

除非進程改變argv[0]進程名稱只是可執行文件的名稱,所以如果您執行/bin/foobar那麼進程名稱將是/bin/foobar。如果你想改變它只是改變可執行文件的名稱,這應該不難。