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 |