프로 세 스 의 디 스 플레이 이름 설정

2444 단어
nginx 가 master 와 worker 프로 세 스 이름 을 표시 하 는 방식 이 멋있다 고 생각 했 습 니 다. 한눈 에 알 수 있 듯 이 apache 에 비해 조금 손 색 이 있 습 니 다.
root     23340     1  0 May24 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody   23341 23340  0 May24 ?        00:00:00 nginx: worker process
nginx 소스 코드 를 보고 이 과정 을 대충 알 게 되 었 습 니 다.a. out 의 ps 이름 을 title 로 변경 해 야 한다 고 가정 하면 title 을 argv [0] 가 가리 키 는 메모리 로 복사 하고 argv [1] 를 0 으로 설정 해 야 하지만 argv [0] 가 가리 키 는 메모리 가 반드시 title 을 수용 할 수 있 는 것 은 아 닙 니 다.Liux 에서 argv 와 environ 이 가리 키 는 메모리 가 연속 적 입 니 다. malloc 는 environ 의 메모 리 를 수용 할 수 있 습 니 다. environ 의 내용 을 malloc 에서 나 온 메모리 에 복사 하여 title 이 environ 의 현재 메모 리 를 차지 하도록 할 수 있 습 니 다.environ 의 메모 리 는 title 을 충분히 내 려 놓 을 수 있 습 니 다.
다음 코드 는 nginx 의 코드 를 참고 하여 작성 합 니 다. 설명 은 주로 argv 와 environ 의 레이아웃 을 나타 냅 니 다. initProcTitle 과 setProcTitle 두 함 수 를 쓰 려 고 합 니 다. 다 중 프로 세 스 의 수 요 를 위해 서 입 니 다. fork 전에 init 를 호출 하고 fork 후에 set 를 호출 하여 부모 프로 세 스 와 하위 프로 세 스 의 이름 을 설정 합 니 다.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

/* example
 * ./a.out start
 * memory layout, supporse ptr point to it
 * ./a.out\0start\0HOSTNAME=vbloger\0TERM=linux\0
 * argc = 2;
 * argv[0] = ptr;
 * argv[1] = ptr + strlen(argv[0])+1;
 * argv[2] = 0;
 * environ[0] = ptr + strlen(argv[0])+1 + strlen(argv[1])+1
 * environ[1] = ptr + strlen(argv[0])+1 + strlen(argv[1])+1 + strlen(environ[0])+1
 * environ[2] = 0;
 */

extern char **environ;
char *last;

void initProcTitle(int argc, char **argv)
{
    size_t size = 0;
    for (int i = 0; environ[i]; ++i) {
        size += strlen(environ[i])+1; 
    }   

    char *raw = new char[size];
    for (int i = 0; environ[i]; ++i) {
        memcpy(raw, environ[i], strlen(environ[i]) + 1); 
        environ[i] = raw;
        raw += strlen(environ[i]) + 1;
    }   

    last = argv[0];
    for (int i = 0; i < argc; ++i) {
        last += strlen(argv[i]) + 1;   
    }   
    for (int i = 0; environ[i]; ++i) {
        last += strlen(environ[i]) + 1;
    }   
}

void setProcTitle(int argc, char **argv, const char *title)
{
    argv[1] = 0;
    char *p = argv[0];
    memset(p, 0x00, last - p); 
    strncpy(p, title, last - p); 
}

int main(int argc, char *argv[])
{
	initProcTitle(argc, argv);
        setProctitle(argc, argv, "master so much argument can you believe");
	sleep(30);  // you can ps now
    return 0;
}

좋은 웹페이지 즐겨찾기