본문 바로가기

프로그래밍/Tizen

[EFL] Ecore_Exe 프로세스간 통신

Ecore_exe 는 하위 프로세스를 실행하고, 통신을 수행한다. IPC를 좀더 간단하게 구현해 놓았다고 보면 된다. 부모에서 프로세스간 파이프를 통해 데이터를 전달하면, 자식 프로세스는 표준 입/출력(stdin/stdout)으로 메시지를 교환하게 된다. 복잡한 내용은 없으므로, 제공되는 샘플만 간단히 살펴본다.


부모 프로세스

pid_t childPid;

Ecore_Exe *child;

ecore_init();


// 자식 프로세스 실행 및 객체 얻기

child = ecore_exe_pipe_run

"./saple_child", // 실행할 프로그램

ECORE_EXE_PIPE_WRITE | ECORE_PIPE_READ, //Ecore_Exe_Flags

NULL ); // data


// pid 얻기

childPid = ecore_exe_pid_get( child );


// 수신 이벤트

// 자식 프로세스의 데이터를 처리할 콜백을 정의한다.

// 이벤트 타입은 ECORE_EXE_EVENT_DATA 이고, 

// 콜백의 마지막 인자(event_info)에 Ecore_Exe_Event_Data 가 전달된다.

ecore_event_handler_add( ECORE_EXE_EVENT_DATA

Ecore_Event_Handler_Cb func,

const void *data );



// 샘플에서는 타이머로 1초마다 메시지를 전달하도록 구성되어 있다.

ecore_timer_add( 1, 타이머콜백, child );


ecore_main_loop_begin();

ecore_exe_free( child );

ecore_shutdown();


Ecore_Exe_Flags 

ECORE_EXE_NONE

ECORE_EXE_PIPE_READ

ECORE_EXE_PIPE_WRITE

ECORE_EXE_PIPE_ERROR

ECORE_EXE_PIPE_READ_LINE_BUFFERED

ECORE_EXE_PIPE_ERROR_LINE_BUFFERED

ECORE_EXE_PIPE_AUTO

ECORE_EXE_RESPAWN 프로세스가 중지되면 다시 시작

ECORE_EXE_USE_SH  /bin/sh 사용

ECORE_EXE_NOT_LEADER

ECORE_EXE_TERM_WITH_PARENT 부모 프로세스가 종료되면, 자식에게 SIGTERM 


이벤트 처리

static Eina_Bool msg_from_child( void *data, int type EINA_UNUSED, void *event_info )

{

Ecore_Exe_Event_Data *data = (Ecore_Exe_Event_Data*)event_info;

data->size;

data->data;


// 콜백을 유지할 필요가 없으니, 완료 처리

return ECORE_CALLBACK_DONE;

}


메시지 전달

static Eina_Bool timer_callback( void *data ) 

{

Ecore_Exe *child = (Ecore_Exe*)data;

ecore_exe_send( child, "msg", strlen("msg") );


// 계속 반복되므로 다시 생성한다.

return ECORE_CALLBACK_RENEW;

}


자식프로세스 제어

void ecore_exe_close_stdin( Ecore_Exe *child );

void ecore_exe_pause( Ecore_Exe *child );    // SIGSTOP

void ecore_exe_continue( Ecore_Exe *child );    // SIGCONT

void ecore_exe_interrupt( Ecore_Exe *child );    // SIGINT

void ecore_exe_quit( Ecore_Exe *child );    // SIGQUIT

void ecore_exe_terminate( Ecore_Exe *child);    // SIGTERM

void ecore_exe_kill( Ecore_Exe *child );    // SIGKILL

void ecore_exe_signa( Ecore_Exe *child);    // SIGUSR

void ecore_exe_hup( Ecore_Exe *child);    // SIGHUP




차일드 프로세스

자식 프로세스는 표준 입출력 처리만 정의하면 된다.

표준입출력 참조.

<unist.h> POSIX 표준입력 : STDIN_FILENO ,표준출력 : STDOUT_FILENO

<stdio.h> 입력 : File* stdin, 출력 File *stdout;

<iostream> std:cin, std:cout


ecore_init();

ecore_main_fd_handler_add( STDIN_FILENO,

ECORE_FD_READ, // 모니터링할 Ecore_Fd_Handler_Flags

callback,    // Ecore_Fd_Cb 

NULL, NULL, NULL);


ecore_main_loop_begin();

ecore_shutdown();



메시지 수신

static Eina_Bool callback( void *data, Ecore_Fd_Handler *fd )

{

char message[BUFFER_SIZE];


// 메시지를 표준입력으로 가져온다

if( ! fgets( message, BUFFER_SIZE, stdin ) ) {

return ECORE_CALLBACK_RENEW;

}


// 메시지를 전달한다.

fprintf( stdout, "message: %s\n", message );

fflush( stdout );



}



'프로그래밍 > Tizen' 카테고리의 다른 글

[Tizen] 패키징 및 signing  (0) 2014.07.31
[EFL] Elementary  (3) 2014.07.17
[EFL] Elementary 위젯  (0) 2014.07.17
[EFL] EDC 스크립트  (0) 2014.07.17
[EFL] Evas 오브젝트  (0) 2014.07.16
[EFL] HTTP 연결  (0) 2014.07.13
[EFL] Ecore 이벤트 핸들러  (0) 2014.07.13
[EFL] 기본 윈도우  (0) 2014.07.13