fork ()가 아닌 execve () 호출에 의해 'ls'가 생성되는 이유

르 레이

쉘에 'ls'와 같은 명령을 입력 할 때마다 내 쉘인 부모 프로세스는 fork () 시스템 호출을 사용하여 복제 한 다음 exec () 시스템 호출을 사용하여 새 프로세스로 대체합니다. 이 경우 'ls'가 종료되면 컨트롤이 내 셸로 다시 전달됩니다.

그러나 'ls'에서 strace를 실행했을 때 execve () 호출 만 표시되고 포크는 표시되지 않으며 컨트롤은 여전히 ​​내 셸로 다시 전달됩니다. 여기 좀 혼란스러워 ...

$ strace ls
execve("/usr/bin/ls", ["ls"], 0x7ffd938934e0 /* 25 vars */) = 0
brk(NULL)                               = 0x1134000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6ea9e38000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=23255, ...}) = 0
cg909

이해가 정확합니다. 달릴 때 strace ls두 개의 포크도 있습니다. 쉘은 스스로 포크 exec()하고 실행하는 데 사용 strace하고 strace는 실행하는 데 동일한 작업을 수행 ls합니다.

strace는 strace의 자식 프로세스 에서 시작된 모든 시스템 호출을 인쇄하기 때문에 strace 출력에서 ​​포크를 볼 수 없습니다 .

  1. bash 포크와 런 strace

  2. strace 포크

  3. 부모 strace는 자식 프로세스에 연결하여 모든 시스템 호출을 가로 챕니다.

    이 시점부터는 시스템 호출 만 볼 수 있습니다.

  4. 자식 strace실행 ls사용execve()

포크가 발생하는 것을 확인하는 한 가지 방법은 strace"외부에서" 부착 하는 것입니다.

  • echo $$셸의 프로세스 ID를 가져 오는 데 사용 합니다.
  • 다른 콘솔strace -f --attach=PID 에서 위의 프로세스 ID로 대체 된 'PID'로 실행 합니다.
  • ls첫 번째 셸에서 실행
  • 다른 콘솔 창에서는 셸에서 발생하는 모든 시스템 호출과 분기 된 자식 ( fork()/ clone()호출 포함)을 볼 수 있습니다.
  • 두 번째 콘솔에서 CTRL + C를 사용하여 strace를 중지합니다.

언급해야 할 다른 한 가지는 fork()현재 Linux 커널에서 clone()시스템 호출을 사용하여 구현 되므로 strace 출력 clone(…)대신에 볼 수 있습니다 fork().

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

MyFragment가 MyClassLoader가 아닌 PathClassLoader에 의해로드되는 이유

분류에서Dev

fork () 호출을 포함하면 더 많은 루프가 생성되는 이유

분류에서Dev

시스템 호출 execve가 ls 함수로 반환되지 않습니다.

분류에서Dev

표준 함수에 의해 호출되는 매개 변수가있는 익명이 아닌 콜백 함수

분류에서Dev

'sudo'를 사용해도 루트가 아닌 계정에서 'ls'명령이 허용되지 않는 이유는 무엇입니까?

분류에서Dev

tkinter bind가 아닌 제어 흐름에 의해 호출되는 함수

분류에서Dev

DataGrid 자동 생성 열에 대해 IValueConverter가 호출되지 않는 이유

분류에서Dev

"sudo ls ~"가 / root가 아닌 / home / username의 내용을 표시하는 이유는 무엇입니까?

분류에서Dev

복사 생성자가 표현식의 반환 문에 의해 호출되는 이유는 무엇입니까?

분류에서Dev

부모의 생성자가 호출되는 이유

분류에서Dev

echo *가 ls로 작동하고 printf *가 아닌 이유는 무엇입니까?

분류에서Dev

fork ()가 호출되기 전에 printf ()가 호출 되더라도 fork ()가 호출 될 때마다 stdout에 대한 printf ()의 반복 출력. 왜 '\ n'이이 문제를 해결합니까?

분류에서Dev

Codesandbox.io의 Svelte 앱에서 TypeError ...가 생성자가 아닌 이유는 무엇입니까?

분류에서Dev

임의의 암호 생성 왜 휴대용이 아닌가?

분류에서Dev

strace가 명령을 execve () 전에 부모 쉘이 자식 프로세스를 fork ()한다고보고하지 않는 이유는 무엇입니까?

분류에서Dev

C ++ : 생성자가 여기에서 호출되는 이유

분류에서Dev

오류 : const 표현식이 예상되는 'const'가 아닌 생성자를 호출 할 수 없습니다.

분류에서Dev

HTML을 사용하는 사용자 이름 필드가 아닌 암호 필드에 대해서만 유효성 검사 오류가 발생합니다.

분류에서Dev

QTreeView에서 편집이 활성화 된 트리거가 아닌 다른 트리거에 의해 시작되는 이유는 무엇입니까?

분류에서Dev

파생 클래스 생성자에서 예외가 발생합니다. 기본 클래스 소멸자가 호출되지만 파생 클래스 소멸자가 아닌 이유는 무엇입니까?

분류에서Dev

Kendo의 ToDataSourceResult가 하나의 쿼리에 대해 두 개의 ADO.Net 호출을 생성하는 이유

분류에서Dev

Dropbox에 내 파일이 아닌 파일의 동기화가 표시되는 이유는 무엇인가요?

분류에서Dev

내 FormLoad 이벤트 핸들러가 인수가있는 생성자가 아닌 사용자 정의 클래스의 기본 생성자를 호출하는 이유는 무엇입니까?

분류에서Dev

각 행에 대해 하나가 아닌 하나의 세이브 호출을 추진하십시오.

분류에서Dev

클론 메서드가 생성중인 클론에서 최종이 아닌 메서드를 호출하지 않는 이유

분류에서Dev

$ IFS가 "ls $ ISF-l"명령에서 공백으로 작동하지만 "Echo hello"가 아닌 이유는 무엇입니까?

분류에서Dev

SQL Server 2014 저장 프로 시저가 아닌 뷰의 코드에 오류가 발생하는 이유

분류에서Dev

vmstat의 swpd가 0이 아닌 이유

분류에서Dev

std :: set의 요소에서 상수가 아닌 멤버 함수를 호출 할 수없는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    MyFragment가 MyClassLoader가 아닌 PathClassLoader에 의해로드되는 이유

  2. 2

    fork () 호출을 포함하면 더 많은 루프가 생성되는 이유

  3. 3

    시스템 호출 execve가 ls 함수로 반환되지 않습니다.

  4. 4

    표준 함수에 의해 호출되는 매개 변수가있는 익명이 아닌 콜백 함수

  5. 5

    'sudo'를 사용해도 루트가 아닌 계정에서 'ls'명령이 허용되지 않는 이유는 무엇입니까?

  6. 6

    tkinter bind가 아닌 제어 흐름에 의해 호출되는 함수

  7. 7

    DataGrid 자동 생성 열에 대해 IValueConverter가 호출되지 않는 이유

  8. 8

    "sudo ls ~"가 / root가 아닌 / home / username의 내용을 표시하는 이유는 무엇입니까?

  9. 9

    복사 생성자가 표현식의 반환 문에 의해 호출되는 이유는 무엇입니까?

  10. 10

    부모의 생성자가 호출되는 이유

  11. 11

    echo *가 ls로 작동하고 printf *가 아닌 이유는 무엇입니까?

  12. 12

    fork ()가 호출되기 전에 printf ()가 호출 되더라도 fork ()가 호출 될 때마다 stdout에 대한 printf ()의 반복 출력. 왜 '\ n'이이 문제를 해결합니까?

  13. 13

    Codesandbox.io의 Svelte 앱에서 TypeError ...가 생성자가 아닌 이유는 무엇입니까?

  14. 14

    임의의 암호 생성 왜 휴대용이 아닌가?

  15. 15

    strace가 명령을 execve () 전에 부모 쉘이 자식 프로세스를 fork ()한다고보고하지 않는 이유는 무엇입니까?

  16. 16

    C ++ : 생성자가 여기에서 호출되는 이유

  17. 17

    오류 : const 표현식이 예상되는 'const'가 아닌 생성자를 호출 할 수 없습니다.

  18. 18

    HTML을 사용하는 사용자 이름 필드가 아닌 암호 필드에 대해서만 유효성 검사 오류가 발생합니다.

  19. 19

    QTreeView에서 편집이 활성화 된 트리거가 아닌 다른 트리거에 의해 시작되는 이유는 무엇입니까?

  20. 20

    파생 클래스 생성자에서 예외가 발생합니다. 기본 클래스 소멸자가 호출되지만 파생 클래스 소멸자가 아닌 이유는 무엇입니까?

  21. 21

    Kendo의 ToDataSourceResult가 하나의 쿼리에 대해 두 개의 ADO.Net 호출을 생성하는 이유

  22. 22

    Dropbox에 내 파일이 아닌 파일의 동기화가 표시되는 이유는 무엇인가요?

  23. 23

    내 FormLoad 이벤트 핸들러가 인수가있는 생성자가 아닌 사용자 정의 클래스의 기본 생성자를 호출하는 이유는 무엇입니까?

  24. 24

    각 행에 대해 하나가 아닌 하나의 세이브 호출을 추진하십시오.

  25. 25

    클론 메서드가 생성중인 클론에서 최종이 아닌 메서드를 호출하지 않는 이유

  26. 26

    $ IFS가 "ls $ ISF-l"명령에서 공백으로 작동하지만 "Echo hello"가 아닌 이유는 무엇입니까?

  27. 27

    SQL Server 2014 저장 프로 시저가 아닌 뷰의 코드에 오류가 발생하는 이유

  28. 28

    vmstat의 swpd가 0이 아닌 이유

  29. 29

    std :: set의 요소에서 상수가 아닌 멤버 함수를 호출 할 수없는 이유는 무엇입니까?

뜨겁다태그

보관