2010-09-21 22 views
5

Khi bạn nhập "ps aux", lệnh ps sẽ hiển thị các đối số lệnh mà chương trình được chạy với. Một số chương trình thay đổi điều này như một cách để chỉ ra tình trạng. Tôi đã thử thay đổi các trường argv [] và nó dường như không hoạt động. Có cách nào tiêu chuẩn để thiết lập các đối số dòng lệnh để chúng xuất hiện khi người dùng gõ ps không?Làm cách nào để đặt các đối số dòng lệnh trong chương trình C để nó hiển thị khi người dùng gõ "ps aux"?

Đó là, điều này không làm việc:

int main(int argc,char **argv) 
{ 
    argv[0] = "Hi Mom!"; 
    sleep(100); 
} 

09:40 imac3:~$ ./x & 
[2] 96087 
09:40 imac3:~$ ps uxp 96087 
USER  PID %CPU %MEM  VSZ RSS TT STAT STARTED  TIME COMMAND 
yv32  96087 0.0 0.0 2426560 324 s001 S  9:40AM 0:00.00 ./x 
09:40 imac3:~$ cat x.c 
+0

Tôi nghĩ ythis là một số loại được gọi là "mở rộng tab bash". Bạn cần phải xác định một trình xử lý mở rộng tab cho chương trình của bạn và đăng ký nó trong một số tập tin, nhưng không hỏi tôi làm thế nào để làm điều này. – fuz

+0

Không thể? (http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC22) Bạn cũng có thể thích (http://www.netsplit.com/2007/01/10/hiding-arguments-from- ps /) – pmg

Trả lời

5

Bạn đã có ý tưởng đúng, nhưng bạn không thay đổi con trỏ trong argv[n], bạn phải thay đổi chuỗi trỏ đến bởi argv[0] bản thân:

#include <string.h> 
#include <unistd.h> 

int main(int argc,char **argv) 
{ 
    size_t maxlen = strlen(argv[0]); 

    memset(argv[0], 0, maxlen); 
    strncat(argv[0], "Hi Mom!", maxlen); 
    pause(); 

    return 0; 
} 

(Lưu ý rằng điều này thực sự thay đổi tên lệnh được hiển thị bởi ps phụ thuộc vào hệ thống).

+0

Sử dụng rất kỳ quặc của 'strncat' ... –

+0

@R ..: Không phải vậy. Kết hợp với 'strlen', @caf đang thực hiện một quan sát rất cẩn thận rằng chúng ta có thể không được đảm bảo có nhiều không gian hơn' argv [0] 'ban đầu để lưu trữ tên chương trình của chúng ta. Ngoài ra, 'memset' là không cần thiết,' strncat' sẽ luôn vô hiệu. Câu trả lời rất rõ ràng, sử dụng 'pause()' tốt đẹp. –

+0

Nhìn lại. 'strncat' đang được sử dụng để nối với một chuỗi có độ dài bằng không, tức là giá trị' strlcpy' rẻ thay vì kết nối thực tế. 'Memset' là không cần thiết, nhưng ít nhất bạn cần' argv [0] [0] = 0; 'để thay thế nó cho chức năng mong muốn. Điều không thể hiểu được này là lý do tại sao tôi nói nó lạ. –

Các vấn đề liên quan