在Linux下如何保證只建立乙個程序

2021-08-21 00:17:04 字數 2205 閱讀 1790

在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就無法得到訊息的處理響應,就會在超時以後再次傳送訊息,導致訊息的重 送。但是...