在linux下,如果不加限制,同乙個程式,可以有多個執行例項,也稱之為程序.它們都有一樣的名字,執行著一樣的**段.不同的是,它們擁有不同的pid以及程序空間.有時候,希望同一時間只能建立乙個程序.下面這段示例**就加了這樣乙個限制.
核心點:
1. 程序在啟動時,判斷/tmp/my_pid_file是否存在;如果不存在,則將當前程序的pid寫入,程式繼續執行;
2. 如果/tmp/my_pid_file已經存在但無內容,則將當前程序的pid寫入,程式繼續執行;
3. 如果/tmp/my_pid_file已經存在且有內容,讀取並判斷該值指向的pid是否正在執行。如果沒有,則將當前程序的pid寫入,程式繼續執行;否則,當前程序退出。使用了 kill(pid, 0) 進行檢測.
4. 在收到sigint和sigterm時,先刪除/tmp/my_pid_file,再退出.
#include #include #include #include #include #include #include #include #define my_pid_file "/tmp/my_pid_file"
#define buf_len_for_pid 64
static int write_pid_into_fd(int fd, pid_t pid)
; /* move cursor to the start of file. */
lseek(fd, 0, seek_set);
sprintf(buf, "%d", pid);
ret = write(fd, buf, strlen(buf));
if(ret <= 0) else
return ret;}/*
* create my_pid_file, write pid into it.
* * @return: 0 is ok, -1 is error.
*/static int create_pid_file(pid_t pid)
; fd = open(my_pid_file, o_wronly | o_creat | o_excl, 0666); /* rw-rw-rw- */
if(fd == -1)
ret = flock(fd, lock_ex);
if(ret == -1)
ret = write_pid_into_fd(fd, pid);
flock(fd, lock_un);
close(fd);
return ret;}/*
* if pid file already exists, check the pid value in it.
* if pid from file is still running, this program need exit();
* if it is not running, write current pid into file.
* * @return: 0 is ok, -1 is error.
*/static int check_pid_file(int fd, pid_t pid)
; ret = flock(fd, lock_ex);
if(ret == -1)
ret = read(fd, buf, sizeof(buf)-1);
if(ret < 0) else if(ret > 0) else
} else
} else if(ret == 0)
flock(fd, lock_un);
return ret;}/*
* * @return: 0 is ok, -1 is error.
*/static int init_pid_file()
else
} else
return ret;
}static void sighandler(int sig)
int main()
/* ctrl + c */
if(signal(sigint, sighandler) == sig_err)
/* kill pid / killall name */
if(signal(sigterm, sighandler) == sig_err)
while(1)
sleep(3);
return 0;
}
kafkaspot在ack機制下如何保證記憶體不溢
storm框架中的kafkaspout類實現的是baserichspout,它裡面已經重寫了fail和ack方法,所以我們的bolt必須實現ack機制,就可以保證訊息的重新傳送 如果不實現ack機制,那麼kafkaspout就無法得到訊息的處理響應,就會在超時以後再次傳送訊息,導致訊息的重 送。但是...
kafkaspot在ack機制下如何保證記憶體不溢
storm框架中的kafkaspout類實現的是baserichspout,它裡面已經重寫了fail和ack方法,所以我們的bolt必須實現ack機制,就可以保證訊息的重新傳送 如果不實現ack機制,那麼kafkaspout就無法得到訊息的處理響應,就會在超時以後再次傳送訊息,導致訊息的重 送。但是...
kafkaspot在ack機制下如何保證記憶體不溢
storm框架中的kafkaspout類實現的是baserichspout,它裡面已經重寫了fail和ack方法,所以我們的bolt必須實現ack機制,就可以保證訊息的重新傳送 如果不實現ack機制,那麼kafkaspout就無法得到訊息的處理響應,就會在超時以後再次傳送訊息,導致訊息的重 送。但是...