programing

Linux에서 C에서 셸 스크립트를 실행하는 방법

prostudy 2022. 6. 23. 22:30
반응형

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

반응형