You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@apr.apache.org by SAMEER KUMAR <sa...@gmail.com> on 2009/04/16 12:17:01 UTC

How to pass a variable (socket) from a program to a child process (which will execute a new program)

How to pass a variable (socket) from a program to a child process (which
will execute a new program)

While using apr_proc_create, how can I pass a variable to the new process
(which is executing a new binray file)

The code I am using is as below...

*file name: echo_listner.c*
*
#include "apr.h"
#include "apr_network_io.h"
#include"apr_thread_proc.h"
#include <stdlib.h>
#include <stdio.h>
#define MAXLINE 100
#define MAXN 100

void new_conn(apr_socket_t **new_sock);
int i=0;
int port=4754;


apr_status_t serve(apr_pool_t *pool)
{
    apr_status_t rv = APR_SUCCESS;
    apr_sockaddr_t *saddr;
    apr_pool_t *subpool;
    apr_socket_t *lskt;
    apr_socket_t *cskt;

//Resources for new process for new connection
    apr_proc_t   new_proc;
    apr_procattr_t  *attr;
    apr_pool_t  *attr_pool, *new_proc_pool;
    apr_thread_start_t func=new_conn(apr_socket_t **);

    for (;;i++) {

    rv = apr_socket_create(&lskt, APR_INET, SOCK_STREAM, APR_PROTO_TCP,
                           pool);
    if (rv)
       return rv;

    rv = apr_sockaddr_info_get(&saddr, "127.0.0.1", APR_UNSPEC, port, 0,
                               pool);
    port++;
    if (rv)
        return rv;

    rv = apr_socket_bind(lskt, saddr);
    if (rv)
            return rv;


    rv = apr_socket_listen(lskt, 5);

    if (rv)
        return rv;

        apr_pool_create(&subpool, pool);
        apr_pool_clear(subpool);

    rv = apr_socket_accept(&cskt, lskt, subpool);
    if(rv)
        return rv;


    printf("\nServer's instance no %d will be created\n", i);

    apr_pool_create(&attr_pool, NULL);
    apr_pool_create(&new_proc_pool,subpool);

    rv= apr_procattr_create (&attr,attr_pool);
    if(rv)
        return rv;
    //printf("\nNew pattr created\n");

    rv = apr_procattr_cmdtype_set(attr,APR_PROGRAM) ;
    if(rv)
        return rv;
    //printf("\nCommand type assigned to execute binary program\n");

    rv = apr_procattr_detach_set(attr, APR_PROC_DETACH_DAEMONIZE);
    //printf("\nDetatch done succeffully\n");
    if(rv)
        return rv;

    rv = apr_socket_inherit_set(cskt);
    if(rv)
        return rv;
    //printf("\nSocket can be now inherited by child\n");


    rv = apr_proc_create (&new_proc,"new_conn",NULL,NULL,
attr,new_proc_pool);
    if(rv)
        return rv;
    printf("\nNew process was created\n");

    rv = apr_socket_close(lskt);
    if(rv)
        return rv;

    continue;

   }

    return rv;
}

int main(int argc, const char * const argv[])
{
    apr_pool_t *pool;
    apr_status_t rv;
    int type=0;

    apr_initialize();
    atexit(apr_terminate);

    apr_pool_create(&pool, NULL);


    rv = serve(pool);
    if (rv) {
        char buffer[256] = { 0 };

        fprintf(stdout, "error: %s\n",
                apr_strerror(rv, buffer, sizeof(buffer)));
    printf("\n There is an error");

        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}*

*file: new_conn.c*
*
#include "apr.h"
#include "apr_network_io.h"
#include <stdlib.h>
#include <stdio.h>
#define MAXLINE 100
#define MAXN 100

extern apr_socket_t *cskt;

int main(int argc, char *argv[])
{


    int    ntowrite;
    ssize_t    nread;
    char    line[MAXLINE], result[MAXN];
    apr_status_t rv;
    apr_size_t len = 100;
        char c;
        printf("\n in new proc I have reached here successfully\n");

    for (;;) {

           rv = apr_socket_recv(cskt, &c, &len);
            if (APR_STATUS_IS_EOF(rv))
                break;
            else if (rv)
                break;
            else if (! len)
                break;

            rv = apr_socket_send(cskt, &c, &len);
            if (APR_STATUS_IS_EOF(rv))
                break;
            else if (rv)
                break;
            else if (! len)
                break;
        }

}


*I want to pass cskt from the echo_listner to the new_conn which will be
executed in new process created in echo_listner. I have made cskt
inheritable. How can I pass it to new process? If i pass it straightway, it
will show error/warning related to type conversion.

Regards,
Sameer Kumar
B.Tech, Computer Engineering
Institute of Technology,
Nirma University,
Ahmedabad, Gujarat
email: sameer.kasi200x@gmail.com
         05bce032@nirmauni.ac.in
Phone: +919375220396