kproc.c
最終更新:2009/12/16
001: /* kproc.c
002: * プロセス処理のサンプル
003: */
004:
005: #define USAGE "Usage: kproc <prog_name> <args>"
006:
007: #include "apr_general.h"
008: #include "apr_file_io.h"
009: #include "apr_errno.h"
010: #include "apr_env.h"
011: #include "apr_strings.h"
012: #include "apr_thread_proc.h"
013:
014: #include "mystab.h"
015:
016: int apr_my_main (
017: int ac, char **av
018: , apr_file_t * astdin
019: , apr_file_t * astdout
020: , apr_file_t * astderr
021: , apr_pool_t * pool
022: ) {
023:
024: apr_status_t rv=APR_SUCCESS;
025:
026: char *prog_name = NULL;
027: char **args = NULL;
028:
029: apr_proc_t proc;
030: apr_pool_t *pool2 = NULL;
031:
032: apr_procattr_t *proc_attr = NULL;
033:
034: if (ac < 2) {
035: apr_file_printf(astderr, "%s\n", USAGE);
036: goto _FINALLY_;
037: }
038:
039: /* 子プロセスが実行するコマンド */
040:
041: prog_name = av[1];
042:
043: /* 子プロセスの実行するコマンドへの引数配列の準備 */
044:
045: if (ac > 1) {
046: int i;
047: args = (char**)apr_palloc(pool, sizeof(char*)*(ac));
048: for (i=0; i<ac-1; i++) { /* args[0] には av[1] が入る */
049: args[i] = av[i+1];
050: }
051: args[i]=NULL; /* 最後はヌル */
052:
053: }
054:
055: /* 子プロセス用引数配列の確認 */
056:
057: if (args) {
058: char **x=args;
059: printf("#prog_name=[%s]\n", prog_name);
060: for (; *x; x++) {
061: printf("#args[%d]=[%s]\n", x-args, *x);
062: }
063: }
064:
065: /* 子プロセス用メモリプール生成 */
066:
067: rv=apr_pool_create(&pool2, NULL);
068: if (APR_SUCCESS != rv) {
069: goto _FINALLY_;
070: }
071:
072: /* 子プロセスの属性情報生成 */
073:
074: rv=apr_procattr_create(&proc_attr, pool);
075: if (APR_SUCCESS != rv) {
076: goto _FINALLY_;
077: }
078:
079: /* 子プロセスのコマンドタイプ設定 */
080:
081: rv=apr_procattr_cmdtype_set(proc_attr, APR_PROGRAM);
082: if (APR_SUCCESS != rv) {
083: goto _FINALLY_;
084: }
085:
086: /* 子プロセスのパイプ準備 */
087:
088: rv=apr_procattr_io_set(proc_attr, APR_FULL_BLOCK, APR_FULL_BLOCK, APR_NO_PIPE);
089: if (APR_SUCCESS != rv) {
090: goto _FINALLY_;
091: }
092:
093: /* 子プロセスの生成 */
094:
095: rv = apr_proc_create(&proc, prog_name, (const char*const*)args, NULL, proc_attr, pool2);
096: if (APR_SUCCESS!=rv) {
097: goto _FINALLY_;
098: }
099:
100: /* 子プロセスへの送信 */
101:
102: if (proc.in) {
103: apr_file_printf(proc.in, "This is a pen.\n");
104: apr_file_printf(proc.in, "That is a pencil.\n");
105: apr_file_close(proc.in);
106: }
107:
108: /* 子プロセスからの受信 */
109:
110: if (proc.out) {
111: #define BUF_SIZE 1024
112: char buf[BUF_SIZE];
113: while (1) {
114: if(APR_EOF == apr_file_eof(proc.out)) {
115: break;
116: }
117: if (APR_SUCCESS == apr_file_gets(buf, BUF_SIZE, proc.out)) {
118: apr_file_printf(astdout, "[%s]\n", buf);
119: }
120: }
121: apr_file_close(proc.out);
122: }
123:
124: /* 子プロセスの終了待ち */
125:
126: {
127: int exitcode=0;
128: apr_exit_why_e why;
129: char *tmp = "";
130: rv = apr_proc_wait(&proc, &exitcode, &why, APR_WAIT);
131: if (APR_CHILD_DONE != rv) {
132: goto _FINALLY_;
133: }
134:
135: rv = APR_SUCCESS;
136:
137: apr_file_printf(astdout, "exitcode=[%d], [", exitcode);
138: switch (why) {
139: case APR_PROC_EXIT:
140: tmp = "process exited normally";
141: break;
142: case APR_PROC_SIGNAL:
143: tmp = "process exited due to a signal";
144: break;
145: case APR_PROC_SIGNAL_CORE:
146: tmp = "process exited and dumped a core file";
147: }
148: apr_file_printf(astdout, "%s]\n", tmp);
149: }
150:
151: _FINALLY_:
152:
153: /* 子プロセス用メモリプールの解放 */
154:
155: if (pool2) {
156: apr_pool_destroy(pool2);
157: pool2 = NULL;
158: }
159:
160: if (APR_SUCCESS != rv) {
161: char error_buf[64];
162: apr_file_printf(astderr,
163: "ERROR: %s\n", apr_strerror(rv, error_buf, sizeof(error_buf)));
164:
165: apr_file_printf(astderr, "failed!\n");
166: return 1; /* 異常終了 */
167:
168: }
169:
170: apr_file_printf(astdout, "\ndone.\n");
171:
172: return 0; /* 正常終了 */
173:
174:
175: } /* end of main */
176:
![]() | KAKU PROJECT (2009) |