Bash에 문제가 있으며 이유를 모르겠습니다.
쉘 아래에 다음을 입력합니다.
echo $$ ## print 2433
(echo $$) ## also print 2433
(./getpid) ## print 2602
“getpid”는 다음과 같이 현재 pid를 얻는 C 프로그램입니다.
int main() { printf("%d", (int)getpid()); return 0; }
나를 혼란스럽게하는 것은 :
- “(명령)”은 하위 프로세스라고 생각합니다. (내가 맞습니까?) 부모의 pid와 pid가 달라야한다고 생각하지만, 같은 이유는 무엇입니까?
- 내 프로그램을 사용하여 괄호 사이에 pid를 표시하면 표시되는 pid가 다릅니다. 맞습니까?
- ‘$$’는 매크로와 같은 것입니까?
도와주세요?
답변
$$
서브 쉘에서 상위 프로세스 ID를 리턴하도록 정의됩니다. “특수 매개 변수”의 맨 페이지에서 :
$ 쉘의 프로세스 ID로 확장됩니다. () 서브 쉘에서는 서브 쉘이 아닌 현재 쉘의 프로세스 ID로 확장됩니다.
에서 bash
4, 당신과 함께 아이의 프로세스 ID를 얻을 수 있습니다 BASHPID
.
~ $ echo $$
17601
~ $ ( echo $$; echo $BASHPID )
17601
17634
답변
다음 중 하나를 사용할 수 있습니다.
$!
마지막 백그라운드 프로세스의 PID입니다.kill -0 $PID
여전히 실행 중인지 확인합니다.$$
현재 쉘의 PID입니다.
답변
- 괄호 는 Bash 에서 서브 쉘을 호출합니다 . 그것은 단지 서브 쉘이기 때문에 동일한 PID를 가질 수 있습니다-구현에 달려 있습니다.
- 호출하는 C 프로그램은 별도의 프로세스이며 고유 한 PID를 가지고 있습니다. 서브 쉘에 있는지 여부는 중요하지 않습니다.
$$
Bash 에서 현재 스크립트 PID 에 대한 별명입니다 . 참조 의 차이$$
와$BASHPID
여기 , 오른쪽이 위의 추가 변수$BASH_SUBSHELL
중첩 수준이 포함되어 있습니다.
답변
시도 getppid()
당신이 당신의 쉘의 PID를 인쇄하여 C 프로그램을 원하는 경우.
답변
알려진 명령의 PID를 얻는 방법을 묻는다면 다음과 유사합니다.
아래 명령을 발행 한 경우 # 발행 된 명령은 ***
dd if = / dev / diskx of = / dev / disky
그런 다음 다음을 사용합니다.
PIDs=$(ps | grep dd | grep if | cut -b 1-5)
여기서 필요한 것은 필요한 모든 고유 문자를 필드에 파이프하고 해당 필드를 사용하여 에코 할 수 있다는 것입니다.
에코 $ PID
답변
올바른 pid를 얻는이 하나의 보편적 인 방법
pid=$(cut -d' ' -f4 < /proc/self/stat)
같은 좋은 하위에 일했다
SUB(){
pid=$(cut -d' ' -f4 < /proc/self/stat)
echo "$$ != $pid"
}
echo "pid = $$"
(SUB)
출력 확인
pid = 8099
8099 != 8100