Linux에서 C에서 셸 스크립트를 실행하는 방법
Linux에서 C에서 셸 스크립트를 실행하려면 어떻게 해야 합니까?
스크립트(또는 실행하는 다른 프로그램)로 수행하는 작업에 따라 달라집니다.
스크립트를 실행하는 것이 가장 쉬운 방법이지만 셸을 실행하고 명령어를 실행하는 등 다른 작업도 수행합니다(대부분 *nix의 /bin/sh).
표준 입력을 통해 셸 스크립트를 공급하거나 표준 출력을 소비하는 경우 사용할 수 있습니다.popen
(그리고pclose
)를 사용하여 파이프를 설정합니다.또한 셸(대부분 *nix 아래의 /bin/sh)을 사용하여 명령을 실행합니다.
이 두 가지 기능은 모두 많은 기능을 하는 라이브러리 기능입니다.다만, 이러한 기능이 요구에 응하지 않는 경우(또는 실험해 보고 학습하고 싶은 경우)에는, 시스템 콜을 직접 사용할 수도 있습니다.이것에 의해, 셸(/bin/sh)이 커맨드를 실행하는 것을 피할 수도 있습니다.
대상 시스템 콜은 다음과 같습니다.fork
,execve
,그리고.waitpid
. 라이브러리 래퍼 중 하나를 사용하는 것이 좋습니다.execve
(입력)man 3 exec
(그들의 리스트에 기입해 주세요.다른 대기 기능 중 하나를 사용할 수도 있습니다(man 2 wait
모두 가지고 있다).또한 시스템 호출에 관심이 있을 수 있습니다.clone
그리고.vfork
포크와 관련이 있습니다.
fork
는 현재 프로그램을 복제합니다.단, 주요 차이점은 새로운 프로세스가 콜에서 포크로 0이 반환된다는 것입니다.상위 프로세스는 새 프로세스의 프로세스 ID(또는 오류)를 반환합니다.
execve
현재 프로그램을 새 프로그램으로 바꿉니다(같은 프로세스 ID 유지).
waitpid
는 부모 프로세스에서 특정 자식 프로세스가 완료될 때까지 대기하기 위해 사용됩니다.
fork 스텝과 execve 스텝을 분리하면 새로운 프로세스가 생성되기 전에 (프로세스 자체를 망치지 않고) 프로그램 설정을 할 수 있습니다.여기에는 표준 입력, 출력 및 stderr을 사용하는 부모 프로세스와 다른 파일로 변경, 프로세스의 사용자 또는 그룹 변경, 자녀가 필요로 하지 않는 파일 닫기, 세션 변경, 환경 변수 변경 등이 포함됩니다.
또한 다음 항목에 관심이 있을 수 있습니다.pipe
그리고.dup2
시스템 콜 pipe
는 파이프(입력 및 출력 파일 기술자 모두 포함)를 작성합니다. dup2
는, 의 파일 기술자 「 기술자」)로서 파일 를 복제합니다.dup
는 유사하지만 파일 기술자가 사용 가능한 최소 파일 기술자와 중복됩니다).
하시면 됩니다.system
:
system("/usr/local/bin/foo.sh");
하면 이 됩니다.sh -c
상태 코드를 반환합니다.
POSIX가 괜찮으시다면 /를 pclose()
사용하실 수도 있습니다.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
/* ls -al | grep '^d' */
FILE *pp;
pp = popen("ls -al", "r");
if (pp != NULL) {
while (1) {
char *line;
char buf[1000];
line = fgets(buf, sizeof buf, pp);
if (line == NULL) break;
if (line[0] == 'd') printf("%s", line); /* line includes '\n' */
}
pclose(pp);
}
return 0;
}
간단한 방법은...
#include <stdio.h>
#include <stdlib.h>
#define SHELLSCRIPT "\
#/bin/bash \n\
echo \"hello\" \n\
echo \"how are you\" \n\
echo \"today\" \n\
"
/*Also you can write using char array without using MACRO*/
/*You can do split it with many strings finally concatenate
and send to the system(concatenated_string); */
int main()
{
puts("Will execute sh with the following script :");
puts(SHELLSCRIPT);
puts("Starting now:");
system(SHELLSCRIPT); //it will run the script inside the c code.
return 0;
}
인사하다
요다 @http://www.unix.com/programming/216190-putting-bash-script-c-program.html
컨트롤이 필요한 는, 「 」를 .fork
pipe
exec
이 셸 route에서 를 가져올 수 . 그러면 응용 프로그램이 셸 스크립트에서 출력된 데이터를 가져올 수 있습니다.
도론이 말한 것처럼 "고급" 제어에는 포크 + execlp가 더 좋습니다.코드 예는 다음과 같습니다.
char 배열 파라미터에 명령어를 저장하고 결과를 위해 malloc 공간을 사용합니다.
int fd[2];
pipe(fd);
if ( (childpid = fork() ) == -1){
fprintf(stderr, "FORK failed");
return 1;
} else if( childpid == 0) {
close(1);
dup2(fd[1], 1);
close(fd[0]);
execlp("/bin/sh","/bin/sh","-c",parameters,NULL);
}
wait(NULL);
read(fd[0], result, RESULT_SIZE);
printf("%s\n",result);
언급URL : https://stackoverflow.com/questions/3736210/how-to-execute-a-shell-script-from-c-in-linux
'programing' 카테고리의 다른 글
명령 프롬프트에서 jar 파일 실행 (0) | 2022.06.23 |
---|---|
비동기 메서드를 사용하여 .vue 파일에서 중단점을 설정할 수 없습니다. (0) | 2022.06.23 |
라라벨 vue 프로젝트에 라라벨 혼합을 사용하면 모든 컴포넌트에 scs 파일을 포함시킬 수 있습니까? (0) | 2022.06.23 |
vuex 상태를 기반으로 한 vuejs 구성 요소의 흐림 또는 집중도 (0) | 2022.06.23 |
Vue는 컴포넌트의 모든 vue/vuewatch를 자동으로 삭제합니까? (0) | 2022.06.23 |