프로그램이 실행 중인지 프로그래밍 방식으로 확인
C에서 프로세스가 이미 Linux/Ubuntu에서 실행 중인지 프로그래밍 방식으로 확인하여 프로세스를 두 번 시작하지 않도록 하려면 어떻게 해야 합니까?저는 pidof와 비슷한 것을 찾고 있습니다.
을▁the▁you▁walk다▁can니걸을습.pid
의 /proc
하세요.cmdline
을 readlink
에서.exe
링크(다음은 첫 번째 방법을 사용합니다.)
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/types.h>
pid_t proc_find(const char* name)
{
DIR* dir;
struct dirent* ent;
char* endptr;
char buf[512];
if (!(dir = opendir("/proc"))) {
perror("can't open /proc");
return -1;
}
while((ent = readdir(dir)) != NULL) {
/* if endptr is not a null character, the directory is not
* entirely numeric, so ignore it */
long lpid = strtol(ent->d_name, &endptr, 10);
if (*endptr != '\0') {
continue;
}
/* try to open the cmdline file */
snprintf(buf, sizeof(buf), "/proc/%ld/cmdline", lpid);
FILE* fp = fopen(buf, "r");
if (fp) {
if (fgets(buf, sizeof(buf), fp) != NULL) {
/* check the first token in the file, the program name */
char* first = strtok(buf, " ");
if (!strcmp(first, name)) {
fclose(fp);
closedir(dir);
return (pid_t)lpid;
}
}
fclose(fp);
}
}
closedir(dir);
return -1;
}
int main(int argc, char* argv[])
{
if (argc == 1) {
fprintf("usage: %s name1 name2 ...\n", argv[0]);
return 1;
}
int i;
for(int i = 1; i < argc; ++i) {
pid_t pid = proc_find(argv[i]);
if (pid == -1) {
printf("%s: not found\n", argv[i]);
} else {
printf("%s: %d\n", argv[i], pid);
}
}
return 0;
}
이것은 존 레드베터가 게시한 코드와 같습니다.cmdline이 아닌 /proc/pid/ 디렉토리에 stat이라는 이름의 파일을 참조하는 것이 좋습니다. 왜냐하면 stat은 프로세스 상태와 프로세스 이름을 제공하기 때문입니다.cmdline 파일은 프로세스가 시작되는 데 사용할 완전한 인수를 제공합니다.그래서 그것은 어떤 경우에는 실패합니다.어쨌든 존이 준 아이디어는 좋습니다.여기에 수정된 John의 코드를 게시했습니다.dhcp가 실행되고 있는지 확인하기 위해 리눅스에서 c 코드를 찾고 있었습니다.이 코드로, 저는 그것을 할 수 있습니다.저 같은 사람에게 도움이 되길 바랍니다.
#include <sys/types.h>
#include <dirent.h>
#include<unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
pid_t proc_find(const char* name)
{
DIR* dir;
struct dirent* ent;
char buf[512];
long pid;
char pname[100] = {0,};
char state;
FILE *fp=NULL;
if (!(dir = opendir("/proc"))) {
perror("can't open /proc");
return -1;
}
while((ent = readdir(dir)) != NULL) {
long lpid = atol(ent->d_name);
if(lpid < 0)
continue;
snprintf(buf, sizeof(buf), "/proc/%ld/stat", lpid);
fp = fopen(buf, "r");
if (fp) {
if ( (fscanf(fp, "%ld (%[^)]) %c", &pid, pname, &state)) != 3 ){
printf("fscanf failed \n");
fclose(fp);
closedir(dir);
return -1;
}
if (!strcmp(pname, name)) {
fclose(fp);
closedir(dir);
return (pid_t)lpid;
}
fclose(fp);
}
}
closedir(dir);
return -1;
}
int main(int argc, char* argv[])
{
int i;
if (argc == 1) {
printf("usage: %s name1 name2 ...\n", argv[0]);
return 1;
}
for( i = 1; i < argc; ++i) {
pid_t pid = proc_find(argv[i]);
if (pid == -1) {
printf("%s: not found\n", argv[i]);
} else {
printf("%s: %d\n", argv[i], pid);
}
}
return 0;
}
피할 수 있는 방법이 있습니다./proc
사용(그리고 그렇게 하는 데 좋은 이유가 있을 수 있음)./proc
기만적인 , 혀설가지않있수고도전았또, 기무있수고도연다또그는숨, 있겨수져있니습을도을언었결되와가인되치적만을는▁가▁might▁pid▁hidden▁in에 pid가 숨겨져 있을 수 ./proc
입니다. 의 방법은좋지 , 거기에 물론입니다, 아래의 방법은 그렇게 좋아 보이지 않습니다, 그것을 위한 적절한 API가 있었으면 좋겠습니다!
어쨌든 1997년 유닉스 프로그래밍 FAQ의 섹션 1.9는 다음과 같이 말합니다.
사용하다kill()
신호 번호에 대해 0을 사용합니다.이 상담을 통해 다음과 같은 네 가지 결과를 얻을 수 있습니다.
kill()
0을 반환합니다.이는 지정된 PID에 프로세스가 존재하고 시스템이 이 프로세스에 신호를 보낼 수 있음을 의미합니다.프로세스가 좀비가 될 수 있는지 여부는 시스템에 따라 다릅니다.
kill()
반값환 -1을 반환합니다.errno
==ESRCH
지정된 PID에 프로세스가 없거나 보안 향상으로 인해 시스템이 존재하지 않습니다(일부 시스템에서는 프로세스가 좀비일 수 있음).
kill()
반값환 -1을 반환합니다.errno
==EPERM
시스템에서 지정된 프로세스를 종료할 수 없습니다.즉, 프로세스가 존재하거나(좀비일 수 있음) 엄격한 보안 기능이 제공됩니다(예: 프로세스가 누구에게도 신호를 보낼 수 없음).
kill()
값 -1을 반환합니다. 다른 값은 다음과 같습니다.errno
큰일 났습니다!
가장 많이 사용되는 기술은 성공 또는 실패를 가정하는 것입니다.EPERM
프로세스가 존재함을 의미하며, 다른 오류는 존재하지 않음을 의미합니다.
pidof는 파일 시스템을 통해 작동합니다.C에서, 당신은 열거함으로써 비슷한 것을 할 수 있습니다./proc
오프닝/proc/X/cmdline
모든 X에 대해 X는 하나 이상의 십진수 목록입니다.휴대성 요구사항이 있는지는 모르겠지만, 사용 가능 여부에 의존해야 할 경우 참고하시기 바랍니다./proc
.
이 문제는 UNIX와 유사한 시스템에서 프로그램의 시작을 싸고 PID 파일을 유지 관리함으로써 더 일반적으로 해결됩니다./etc/init.d/*
이 접근법의 전형적인 예를 위해.PID 파일을 읽는 코드가 안전한 방식으로(원자적으로) 작성되도록 주의해야 합니다.대상 OS에 systemd와 같은 더 강력한 기능이 있다면 이 작업을 아웃소싱할 수 있습니다.
언급URL : https://stackoverflow.com/questions/6898337/determine-programmatically-if-a-program-is-running
'programing' 카테고리의 다른 글
아리아 로그 마리아 사용 안 함DB (0) | 2023.08.18 |
---|---|
Excel에서 SQL Server 2005로 가져오는 잘라내기 오류 (0) | 2023.08.18 |
PowerShell의 사용자 지정 로보카피 진행률 표시줄 (0) | 2023.08.18 |
ORACLE 키워드를 열로 사용하는 XML 모델이 역엔지니어링 중에 변환되지 않음 (0) | 2023.08.18 |
인라인 블록 동작을 유지하면서 div를 상위에 정렬하는 방법은 무엇입니까? (0) | 2023.08.18 |