system() 함수에서...

koonpal의 이미지

main {
...
system("vmstat -n 1");
printf("****************");
...
}

system함수를 사용하고 있는데 위와 같은 경우 어떻게 해야 되나요...
vmstat를 1초마다 실행을 하는 것인데...
그래서 그런지 system에서 vmstat가 계속적으로 실행이 되고...
그 다음 줄 printf가 실행이 되지 않습니다...
system에서 vmstat-n 1을 실행시키고 vmstat는 데몬으로 돌아가고...
그 다음 명령을 계속 실행하고 싶은데...
그렇게 하는 방법이 없나요...
system 함수에서 방법이 없다면...
다른 함수를 가지고 할 수 있는 방법 좀 가르쳐 주세요...
부탁을 드리겠습니다...

scobyseo의 이미지

fork 와 exec 함수계열 함수를 사용하십시오.

예를들어,

int pid;
pid = fork ();
if (pid == 0){
    execl ("vmstat", "vmstat", "-n", "1", NULL);
}

위의 코드와 같이 할 수 있습니다. 그럼.

서명:
이것은 올리는 글에 첨부될 사인 문구입니다. 제한은 255 글자입니다

임홍장의 이미지

system() 은 내부에

    signal()  // SIGCLD 처리 
    fork() ;
    exec("/bin/sh","-c", "vmstat -n 1", NULL);
    wait();
    signal( ) // 원래의 시그널 마스크로 되돌림

이 모두를 합쳐서 구현되었습니다. 자식이 끝날때 까지 블락상태로 wait 합니다.

vmstat -n 1 의 결과를 얻으려면 popen 으로 열어야 합니다.
그냥 vmstat 을 실행하려면 백그라운드로 실행시키면 됩니다.
system("vmstat -n 1 &");

popen("vmstat -n 1", "r") ;
pclose(ptr);