programing

C에서 다른 과정을 어떻게 생성합니까?

muds 2023. 8. 19. 10:55
반응형

C에서 다른 과정을 어떻게 생성합니까?

외부 프로그램을 실행하고 C를 사용하여 명령줄 매개 변수를 전달하는 방법은 무엇입니까?운영 체제 API를 사용해야 하는 경우 Windows, Mac 및 Linux용 솔루션을 포함합니다.

이는 정확히 무엇을 하려는가에 따라 달라집니다.

  1. OS에 종속
  2. 당신이 무엇을 하려고 하는지 잘 모르겠습니다.

그럼에도 불구하고, 저는 당신이 결정할 수 있도록 몇 가지 정보를 제공하도록 노력하겠습니다.
UNIX에서fork()사용자가 포크를 호출한 위치에서 프로세스의 복제본을 만듭니다. 다음과 과정을 , 과같과거정됩치니다면즉을은다음▁meaning:됩니다▁i,,즉▁if.

#include <unistd.h>
#include <stdio.h>

int main()
{
    printf( "hi 2 u\n" );
    int mypid = fork();

    if( 0 == mypid )
        printf( "lol child\n" );
    else
        printf( "lol parent\n" );

    return( 0 );
}

출력은 다음과 같습니다.

2 u안녕 2 u.
ㅋㅋㅋㅋ 아이
부모님 ㅠㅠㅠㅠㅠ

이 신이당 때.fork()자식에서 반환된 pid는 0이고 부모에서 반환된 pid는 자식의 pid입니다."hi2u"는 한 번만 인쇄됩니다.부모에 의해

execve()은 거의 그고그기제의거품항사의다용상니됩은군능들것리의▁are▁with▁of다▁used와 함께 됩니다.fork(). execve()등은 전달하는 응용 프로그램의 이름으로 현재 스택 프레임을 덮어씁니다.execve() 에거항사용니다됩상의와 사용됩니다.fork()여기서 자식 프로세스를 포크하고 부모인 경우 계속해야 하는 모든 작업을 수행하고 자식인 경우 새 프로세스를 실행합니다.execve()또한 거의 항상 에 사용됩니다.waitpid()waitpid는 자식 프로세스의 pid를 취하며 문자 그대로 자식 프로세스가 종료될 때까지 기다렸다가 자식의 종료 상태를 사용자에게 반환합니다.

이 정보를 사용하면 명령줄에서 프로세스 이름을 가져와서 명령하는 프로세스를 실행하는 매우 기본적인 셸을 작성할 수 있습니다.물론 셸은 파이프 입출력과 같은 그 이상의 기능을 하지만, 당신은 다음을 사용하여 기본을 달성할 수 있어야 합니다.fork(),execve()그리고.waitpid().

참고: *nix에 따라 다릅니다!이것은 Windows에서 작동하지 않습니다.

이것이 도움이 되었기를 바랍니다.

외부 프로그램의 출력을 읽는 것과 같이 보다 복잡한 작업을 수행하려면 시스템 호출을 여는 것이 좋습니다.예를 들어, 디렉토리 목록에 프로그래밍 방식으로 액세스하려면 다음과 같은 내용을 작성할 수 있습니다.

#include <stdio.h>

int main()
{
  int entry = 1;
  char line[200];
  FILE* output = popen("/usr/bin/ls -1 /usr/man", "r");
  while ( fgets(line, 199, output) )
  {
    printf("%5d: %s", entry++, line);
  }
}

이렇게 산출물을 내는 것.

1: cat1
2: cat1b
3: cat1c
4: cat1f
5: cat1m
6: cat1s
...
#include <stdlib.h>

int main()
{
    system("echo HAI");

    return 0;
}

저는 도서관을 쓸 때 시스템을 사용하지 말고 100% 시스템을 사용하지 말라고 경고하고 싶습니다.이것은 30년 전에 디자인되었습니다. 그 당시에 멀티스레딩은 유닉스라고 불리는 장난감 운영체제에 알려지지 않았습니다.그리고 오늘날 거의 모든 프로그램이 멀티스레드화되어 있을 때에도 여전히 사용할 수 없습니다.

popen을 사용하거나 fork+execvp를 수행하십시오. 그렇지 않으면 신호 처리, 환경 처리 코드 충돌 등의 문제를 찾기가 어렵습니다.선택되고 가장 높은 평가를 받은 답변이 "시스템"의 사용을 촉진한다는 것은 순전히 악이고 부끄러운 일입니다.직장에서 코카인의 사용을 촉진하는 것이 더 건강에 좋습니다.

UNIX에서 산란 프로세스를 산란 프로세스에서 분리하여 실행하려면 기본적으로 포크가 필요하다고 생각합니다. 예를 들어 산란 프로세스를 종료할 때 산란 프로세스가 종료되지 않도록 하려면 포크가 필요합니다.

포크, 시스템, Exec의 모든 미묘한 차이를 설명하는 페이지가 있습니다.

Win, Mac, Linux에서 작업한다면 Qt Framework와 QProcess 객체를 추천할 수 있지만, 그것이 당신에게 적합한 옵션인지 모르겠습니다.큰 장점은 Windows Linux와 Mac에서 동일한 코드를 컴파일할 수 있다는 것입니다.

 QString program = "./yourspawnedprogram";
 QProcess * spawnedProcess = new QProcess(parent);
 spawnedProcess->start(program);
 // or spawnedProcess->startDetached(program);

그리고 추가 비용으로, 당신은 심지어 모체 과정에서 자식 과정을 죽일 수도 있고, 스트림을 통해 그것과 계속 소통할 수도 있습니다.

한 가지 해결책은 stdlib.h에 정의된 시스템 기능입니다.

int system(const char *string);

시스템 API 예제

외부 명령의 출력을 확인/읽기/파싱해야 할 경우 system() 대신 popen()을 사용하는 것이 좋습니다.

플랫폼에 의존하는 레시피에 대해 말하자면, Windows에서는 CreateProcess를 사용하고 Posix(리눅스, Mac)에서는 사용합니다.fork+execvp.그렇지만system()기본적인 요구사항을 충족해야 하며 표준 라이브러리의 일부입니다.

언급URL : https://stackoverflow.com/questions/17140/how-do-you-spawn-another-process-in-c

반응형