다른 프로그램을 실행하기 위해 C 프로그램을 어떻게 작성합니까?
리눅스에서는 다른 프로그램을 실행하는 C 프로그램을 작성하고 싶습니다.프로그램이 실행되면 셸은 사용자가 프로그램에서 정의한 명령을 입력하기를 기다립니다.이 명령을 실행하면 두 번째 프로그램이 시작됩니다.
예를 들어 호출 프로그램과 동일한 디렉토리에 "hello"라는 간단한 C 프로그램이 있다고 가정합니다."hello" 프로그램은 "hello, world" 출력을 출력합니다.첫 번째 프로그램이 실행되고 사용자는 "안녕하세요"라는 명령을 입력합니다."hello" 프로그램이 실행되고 "hello, world."가 셸에 출력됩니다.
검색을 좀 해봤는데 사람들이 "fork()"와 "exec()" 기능을 제안했습니다.다른 사람들은 "시스템()"을 사용하라고 말했습니다.저는 이 기능들에 대해 전혀 알지 못합니다.이 기능들을 어떻게 부르죠?사용하기에 적절한가요?
설명이 포함된 예제 코드가 가장 도움이 될 것입니다.다른 대답도 환영합니다.당신의 도움에 대단히 감사드립니다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> /* for fork */
#include <sys/types.h> /* for pid_t */
#include <sys/wait.h> /* for wait */
int main()
{
/*Spawn a child to run the program.*/
pid_t pid=fork();
if (pid==0) { /* child process */
static char *argv[]={"echo","Foo is my name.",NULL};
execv("/bin/echo",argv);
exit(127); /* only if execv fails */
}
else { /* pid!=0; parent process */
waitpid(pid,0,0); /* wait for child to exit */
}
return 0;
}
포크를 처음 사용하는 경우 포크와 exec에 대한 그래픽 표현이 도움이 될 수 있습니다.
묘사하기fork()
+-------------+
|main program |
+-------------+ (fork())
|___________________________
+-------------+ |
|main program | +-------------+
+-------------+ |main program |
| +-------------+
+-------------+ | (exec())
|main program | +-------------+
+-------------+ |hello program|
+-------------+
이미 자습서에서 읽었을 수도 있겠지만, 전화를 한 후에fork()
기존 프로그램의 복제 사본이 생성되고,exec()
그런 다음 복사본을 새 프로그램으로 대체하고 인수로 전달합니다.2개의 프로그램에 대한 2개의 실행 유닛이 다음에 실행될 것입니다.fork()
.
충분하지 않겠습니까?
/* ... */
if (!strcmp(cmd, "hello")) system("hello.exe");
/* ... */
가장 간단한 경우에는 한 디렉토리에 두 개의 컴파일된 프로그램이 있어야 합니다.
> ls
.
hello
second
두 번째 프로그램에서는 전화만 하면 됩니다.system("hello");
제가 검색을 좀 해봤는데, 사람들이 제안한 것은
fork()
그리고.exec()
기능들.다른 사람들은 사용하라고 했습니다.system()
는 이 알지 못합니다 저는 이 기능들에 대해 전혀 알지 못합니다.이 기능들을 어떻게 부르죠?사용하기에 적절한가요?
예. 문서를 먼저 읽습니다(man
페이지), 예를 들어 포크(2), exec(3), 시스템(3).아마도 man(1)을 사용하여 컴퓨터에 로컬로 문서를 가지고 있을 것입니다.주의하세요.system
를 사용합니다(thru bash(1) 또는 dash(1)).fork
-ing, execeve(2)-ing and waitpid(2)-ing the/bin/sh
포식스 포탄.
그것은 성공하면 "두 번" 돌아오므로 이해하기 어렵다고 생각합니다.여기서 설명하려고 하지는 않겠습니다(여러 페이지가 필요합니다).저는 처음에는 포크(시스템 호출) 위키페이지를 읽는 것을 추천합니다.그런 다음 고급 Linux 프로그래밍(무료 다운로드 가능)과 같은 좋은 Linux 프로그래밍 책을 읽어 보십시오.
운영 체제를 읽을 수도 있습니다. 좀 더 일반적인 보기를 위한 세 가지 쉬운 작품.
질문에 대한 답은 두 번째(또는 자식) 프로그램을 실행한 후 부모 프로그램에서 추가 문을 실행할지 여부에 따라 달라집니다.
두 번째(또는 자식) 프로그램을 실행한 후 부모 프로그램에서 추가 문을 실행하려면 다음을 사용합니다.system()
.
두 번째(또는 자녀) 프로그램을 실행한 후 부모 프로그램에서 추가 문장을 실행할 필요가 없다면 다음을 사용합니다.execv()
두번째 프로세스는 생성되지 않습니다.부모 프로그램이 종료되고 부모 프로그램과 동일한 프로세스 ID로 두 번째 프로그램이 실행됩니다.
추신. 이 시나리오에서, 당신은 또한system()
. 하지만 만약 당신이 사용하면.system()
, 프로세스 ID가 서로 다른 두 개의 프로세스가 생성됩니다. 즉, 메인 프로그램의 프로세스 ID와 두 번째 프로그램의 프로세스 ID가 생성됩니다.
예제에서는 다음 중 하나를 사용할 수 있습니다.system()
기능 혹은 더execv()
기능.
다음은 다음을 이용한 간단한 자기 설명 예입니다.system()
:
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello from the parent process\n");
if ( system("echo 'Hello from the child process' > test.txt") != 0 )
{
printf("ERROR executing system() command\n");
}
if ( system("cat test.txt") != 0 )
{
printf("ERROR executing system() command\n");
}
printf("Executing from the parent process again!\n");
}
출력은 다음과 같습니다.
Grinchs-MBP:Downloads rob$ ./parent3
Hello from the parent process
Hello from the child process
Executing from the parent process again!
다음을 포함하는 것을 기억합니다.stdlib.h
일r 파일)을 system()
.
자식 또는 두번째 프로그램이 종료된 후 부모 프로그램에서 추가 문장을 실행할 필요가 없다면 다음을 사용합니다.execv()
부모 프로그램에서.
이 경우 다음을 사용하여 포크를 생성할 필요가 없습니다.fork()
. 당신은 단지 사용하기만 하면 됩니다.execv()
. 사용하시려면execv()
, 포함하는 것을 기억합니다.unistd.h
헤더 파일입니다.
.execv()
가 호출되며, 호출된 프로세스는 종료되고 메모리의 할당된 부분과 동일한 ID의 새 프로세스로 대체됩니다.
만약에execv()
성공적으로 실행되어 반환되지 않습니다.만약 반송이 된다면 오류가 발생하기 때문입니다. 말로 하자면,즉,execv()
부모 프로그램에서 실행하려는 마지막 문장이 되어야 합니다.execv()
오류가 발생한 경우에만 부모 프로그램으로 돌아갑니다.
다시 - 부모 프로그램에서 다른 프로그램을 실행하고 두 번째(또는 자식) 프로그램이 끝난 후 부모 프로그램에서 추가 문을 실행하려면 다음을 사용합니다.system()
대신.
다음은 다음을 사용한 간단한 예입니다.execv()
:
상위프로세스코드
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
int main ()
{
printf ("I am the parent process\n\n");
char *arg_Ptr[4];
arg_Ptr[0] = "child.c";
arg_Ptr[1] = "Hello from the child process";
arg_Ptr[2] = "Good-Bye from the child process!";
arg_Ptr[3] = NULL;
execv("/Users/rob/Downloads/child.bin", arg_Ptr);
printf ( "Error: %i\n", errno);
}
하위 프로세스 코드( /Users/rob/Downloads/child.bin에 저장됨).
#include <stdio.h>
int main(int argc, char *argv[])
{
printf ("I am the child process\n");
printf ("Argument 1: %s\n", argv[1]);
printf ("Argument 2: %s\n", argv[2]);
printf ("Argument 3: %s\n", argv[3]);
}
여기 출력이 있습니다.
Grinchs-MBP:Downloads rob$ ./parent
I am the parent process
I am the child process
Argument 1: Hello from the child process
Argument 2: Good-Bye from the child process!
Argument 3: (null)
언급URL : https://stackoverflow.com/questions/5460421/how-do-you-write-a-c-program-to-execute-another-program
'programing' 카테고리의 다른 글
사용자 지정 http 헤더를 Spring RestTemplate 요청에 추가 / extend RestTemplate (0) | 2023.10.20 |
---|---|
MySQL의 VARCHAR vs TEXT (0) | 2023.10.20 |
템플릿이 존재하지 않음 - Django 오류 (0) | 2023.10.20 |
커서 잡기(드래그 & 드롭)를 위한 CSS (0) | 2023.10.20 |
바인딩되지 않은 메서드 f ()은(대신 classobj 인스턴스를 받았음) fibo_instance를 첫 번째 인수로 호출해야 합니다. (0) | 2023.10.20 |