프로 세 스 PID 가 져 오기

10660 단어
프로그램 에 서 는 항상 이러한 기능 이 필요 합 니 다. 이 프로그램의 단일 인 스 턴 스 만 실행 할 수 있 습 니 다. 즉, 프로그램 을 여러 번 실행 할 수 없습니다.어떤 프로 세 스 가 실행 되 고 있 는 지 확인 합 니 다. 셸 에 서 는 명령 ps - A | grep xxx 로 쉽게 찾 을 수 있 지만 프로그램 에 서 는 어떻게 검 측 해 야 합 니까?나 는 aecium 프로그램의 방법 을 참고 했다. 같은 ps - A | grep xxx 를 호출 했다.dbus, 시스템 신 호 량 등 더 선진 적 인 방법 이 존재 할 수 있 습 니 다. 한 마디 로 하면 이것 이 가장 좋 은 방법 은 아니 지만 그 기 교 를 보 세 요.
먼저 현재 프로 세 스 의 이름 을 grep 에 전달 하려 면 main 의 argv [0] 를 통 해 실 행 될 때의 프로그램 이름 을 얻 을 수 있 습 니 다. 그러나 주의해 야 할 것 은 경 로 를 통 해 실 행 된 프로그램, 예 를 들 어./a. out, argv [0] 도./a. out 입 니 다.
#include <stdio.h>

#include <stdlib.h>
#include <string.h>
#include <signal.h>
 
void program_unique_check( const char * program)
{
FILE * fd;
pid_t id = 0 ;
char command[ 50 ] = { 0 } ;
char pid_num[ 50 ] = { 0 } ;
const char * program_name;
 
program_name = strrchr ( program, '/' ) ;
 
//
if ( program_name)
++ program_name;
else
program_name = program;
 
// ps -Ao pid,comm|grep xxx
sprintf( command, "ps -Ao pid,comm|grep %s" , program_name) ;
 
printf ( "Command to excute: %s/n " , command) ;
 
//
if ( ( fd = popen( command, "r" ) ) == NULL ) {
perror( "popen" ) ;
exit( EXIT_FAILURE) ;
}
 
// , PID, 20 (PID !)
fgets( pid_num, 20 , fd) ;
printf ( "Result :/n %s/n " , pid_num) ;
 
//
id = atoi( pid_num) ;
printf ( "DETECTED PID: %d/n " , id) ;
 
//
if ( getpid( ) == id)
printf ( "This's my self: %d/n " , id) ;
else {
printf ( "Here's one already running: %d/n I'll kill him!/n " , id) ;
//SIGKILL ,
if ( kill ( id, SIGKILL) == - 1 ) {
perror( "kill" ) ;
exit( EXIT_FAILURE) ;
}
}
}
 
int main ( int argc, char ** argv)
{
program_unique_check( argv[ 0 ] ) ;
sleep ( 10 ) ;
return 0 ;
}

좋은 웹페이지 즐겨찾기