C로 된 리눅스 팝 오픈 시스템 콜

Clo Doen Linugseu Pab Opeun Siseutem Kol



' popen() 함수는 문자열의 명령에 의해 주어진 명령을 수행합니다. 함수는 파이프를 읽거나 쓰는 데 사용되는 스트림에 대한 포인터를 반환하는 동시에 호출 응용 프로그램과 실행된 명령 사이에 파이프를 생성해야 합니다. Popen 함수는 I/O 함수의 표준 라이브러리에서 사용할 수 있으며 터미널 명령을 실행하는 두 번째 프로세스를 생성합니다. popen()의 개방 단계는 fopen() 함수의 개방 단계와 동일합니다. popen() 함수는 분기, 파이프 구성 및 셸 실행을 통해 프로세스를 시작합니다. 파이프는 기본적으로 단방향이기 때문에; 결과적으로 스트림은 읽기 전용 또는 쓰기 전용입니다. popen() 함수가 성공적으로 실행되면 파이프가 읽고 쓰는 데 사용되는 열린 스트림을 얻습니다.'

실시예 1

다음 예제 프로그램에서 popen 시스템 호출을 사용하여 현재 디렉토리 또는 폴더에 존재하는 파일을 읽습니다. 먼저 C 표준 라이브러리의 stdio.h 헤더 파일을 입력했습니다. 그런 다음 popen 함수를 배포한 int main() 함수 프로그램이 있습니다. 그 전에 'FILE' 클래스에서 포인터 변수 'FileOpen'을 설정했습니다. 파일의 포인터 변수는 읽거나 쓸 다음 바이트를 나타냅니다.







그런 다음 읽을 문자의 한계 값을 할당했습니다. 그런 다음 'FileOpen' 변수가 'popen' 기능을 호출했습니다. 'popen' 기능은 현재 디렉토리의 모든 파일을 나열하는 Linux의 'ls -l' 명령을 사용합니다. 또한 읽기 모드를 나타내는 'r' 매개변수를 popen 함수에 입력했습니다.



여기에서는 popen 함수를 사용하여 파일 읽기 프로세스를 파이프했습니다. 다음으로 생성된 파이프를 while 루프로 처리했습니다. while 루프는 'line', 'sizeof line' 및 'FileOpen' 인수를 사용하는 fgets 메서드를 사용합니다. fget은 파이프된 프로세스를 읽고 문자열의 '%s' 기호에 저장합니다. 이 특정 기호는 'line' 인수와 함께 printf 메서드 내에서 호출됩니다. pclosed 함수를 사용하여 처리된 파이프를 생성하면 파이프된 프로세스는 아래 프로그램의 끝에서 배포된 대로 닫힐 수 있습니다.



#include


정수 메인 ( )

{

파일 * 파일열기;

문자 라인 [ 130 ] ;


파일열기 = 열기 ( 'ls -l' , '아르 자형' ) ;

동안 ( fgets ( 줄, 줄 크기, 파일열기 ) )

{

인쇄 ( '%에스' , 선 ) ;

}

닫기 ( 파일열기 ) ;

}





C 프로그램의 popen 함수는 위의 과정을 분기하여 파이프를 생성했습니다. 이제 C 컴파일 명령을 사용하여 셸에서 처리된 스트림 파이프를 실행했습니다. 출력은 '홈' 디렉토리에서 프로그램을 실행한 대로 '홈' 디렉토리의 모든 파일을 나열합니다.



실시예 2

이전 popen 프로그램에서 파일 읽기의 스트리밍 프로세스를 파이핑하는 데 사용되는 popen 프로그램의 기능에 대한 간단한 데모가 있습니다. 이제 우리는 쓰기 모드로 프로세스를 파이프한 popen 함수의 또 다른 예를 들었습니다. main 함수가 있는 프로그램을 생각해 봅시다. main 함수 내부에 파일 포인터 변수를 'file'로 구성했습니다. 파일 포인터는 popen 함수와 함께 배포됩니다.

popen 함수는 'cat' 명령과 쓰기 모드에 대해 'w'를 사용합니다. 여기에서 각 File 인수는 순차적으로 읽고 cat 명령에 의해 표준 출력으로 전송됩니다. for 루프 본문에서 '%d' 기호를 지정한 대로 숫자 카운트 값을 인쇄하기 위해 fprintf 함수를 사용했습니다. 그런 다음 pclose 시스템 호출로 파이프 열기 프로세스를 닫습니다.

#include


정수 메인 ( 정수 인수, 문자 ** argv ) {

파일 * 파일 = 열다 ( '고양이' , '안에' ) ;

정수 x = 0 ;


~을 위한 ( 엑스 = 0 ;엑스 < 5 ;x++ ) {


fprintf ( 파일 , '내 백작 = %d \N ' , x ) ;
}

닫기 ( 파일 ) ;

반품 0 ;

}

위에서 생성한 프로세스를 실행하면 다음과 같이 카운트 값이 출력됩니다.

실시예 3

이제 한 프로세스의 데이터를 다른 프로세스로 전송하는 또 다른 프로그램이 있습니다. 우리는 popen 함수의 파이프로 이것을 할 것입니다. 우리는 C의 표준 라이브러리를 사용하여 프로그램을 구현했습니다. 그런 다음 프로그램을 배포하기 위한 int main 함수가 있습니다. 여기에서 'buffer' 인수를 사용하여 sprintf 함수에 문자열을 지정했습니다. sprintf() 함수는 결과를 프롬프트로 보내지 않고 sprintf가 제공하는 char 버퍼에 보관합니다.

그런 다음 'read' 변수 내에서 popen 함수를 호출했습니다. 거기에는 popen 함수 안에 두 개의 프로세스가 있습니다. 'wc -c'는 제공된 문자를 계산하는 데 사용되는 첫 번째 프로세스이고 두 번째 프로세스는 'w'로 파이프가 쓰기 모드로 열려 있음을 나타냅니다. 그런 다음 파이프를 사용하여 데이터를 쓰는 'fwrite' 함수가 있습니다. 데이터는 'wc'에 의해 수신된 다음 문자를 계산하고 쉘에 표시됩니다.

#include

#include

#포함

#include<문자열.h>

정수 메인 ( )

{

파일 * 읽다 ;

문자 버퍼 [ 오십 ] ;

스프린트 ( 완충기, '리눅스 시스템 콜' ) ;

읽다 =팝니다 ( '화장실 -c' , '안에' ) ;

쓰기 ( 버퍼,크기 ( ) ,스트렌 ( 완충기 ) , 읽다 ) ;

닫기 ( 읽다 ) ;

}

위에서 지정한 문자열에 '17' 문자가 포함되어 있으므로 프롬프트에 표시되는 문자는 '17'입니다. 'wc -c' 프로세스는 이러한 문자를 읽고 출력으로 인쇄합니다.

실시예 4

위의 popen 예제는 한 프로세스에서 다른 프로세스로 데이터를 보냅니다. 여기에서 파이프를 통해 한 프로세스에서 다른 프로세스로 데이터를 수신합니다. 프로그램의 주요 기능은 '50' 값을 취하는 버퍼를 구성하는 것입니다. 그런 다음 popen 함수가 프로세스를 생성하는 변수 'r'을 생성했습니다. 'ls' 프로세스는 디렉토리의 파일을 나열하는 데 사용되며 'r' 프로세스는 파이프에서 데이터를 읽는 데 사용됩니다. 'ls' 프로세스는 읽을 데이터를 'r' 프로세스로 전송합니다. 그 다음에는 데이터를 읽고 버퍼에 데이터를 저장하는 fread 함수가 있습니다. 그런 다음 print 문은 버퍼에 저장된 데이터를 인쇄합니다.

#include

#include

#포함

#include<문자열.h>

정수 메인 ( )

{

파일 * 아르 자형;

문자 버퍼 [ 오십 ] ;


r = 열다 ( '이' , '아르 자형' ) ;

두들겨 패다 ( 완충기, 1 , 25 , r ) ;


인쇄 ( '%에스 \N ' , 버퍼 ) ;

닫기 ( 아르 자형 ) ;

}

여기서는 작업 디렉토리에서 기존 파일의 '50'자만 표시됩니다. 따라서 출력에는 50자만 포함됩니다.

결론

우리는 C 언어로 된 Linux popen 시스템 호출에 대한 자세한 데모를 제공했습니다. 우리는 popen 함수를 배포한 네 가지 예를 구현했습니다. popen 함수는 할당한 모드에 따라 파이프 스트림을 반환합니다. 예제에서는 파일 처리 함수 fread 및 fwrite와 함께 읽기 및 쓰기 모드를 모두 사용했습니다. popen() 함수의 프로그램 이름을 첫 번째 인수로 사용했습니다. 두 번째 인수는 읽기 모드의 파일 'r' 또는 쓰기 모드의 'w'입니다.