[ale] C question

Ed Cashin ecashin at noserose.net
Fri Apr 5 20:06:51 EDT 2013


You have to exec the child and supply the args in case 0 after you dup the
file descriptor to the STDIN_FILENO, 0, too, and set up its stdout and
stderr how you want.  Then there's the issue of the other file descriptors,
which you should close in the child before you exec the binary.  The
environment, also, needs attention sometimes, for security.

What's a good online or printed resource for this stuff?  I am thinking I
have some W. Richard Stevens book that has all this, but there's a lot to
remember to keep it secure unless it's a throw-away project.

It reminds me of Dan Bernstein's daemontools project.  He thought that it
should be possible to use programs that could do all this stuff for you.



On Fri, Apr 5, 2013 at 7:56 PM, Ed Cashin <ecashin at noserose.net> wrote:

> I was going to write this example before realizing it is probably online,
> and I found it here:
>
> http://pubs.opengroup.org/onlinepubs/9699919799/functions/pipe.html
>
> ... in the docs for standard pipe(2) behavior.  It looks like the stuff
> after the ellipsis is in main or some other function whose beginning and
> end aren't shown.
>
> #include <stdlib.h>
> #include <unistd.h>
> ...
>
> int fildes[2];
> const int BSIZE = 100;
> char buf[BSIZE];
> ssize_t nbytes;
> int status;
>
> status = pipe(fildes);
> if (status == -1 ) {
>     /* an error occurred */
>     ...
> }
>
> switch (fork()) {
> case -1: /* Handle error */
>     break;
>
> case 0:  /* Child - reads from pipe */
>     close(fildes[1]);                       /* Write end is unused */
>     nbytes = read(fildes[0], buf, BSIZE);   /* Get data from pipe */
>     /* At this point, a further read would see end of file ... */
>     close(fildes[0]);                       /* Finished with pipe */
>     exit(EXIT_SUCCESS);
>
> default:  /* Parent - writes to pipe */
>     close(fildes[0]);                       /* Read end is unused */
>     write(fildes[1], "Hello world\n", 12);  /* Write data on pipe */
>     close(fildes[1]);                       /* Child will see EOF */
>     exit(EXIT_SUCCESS);
> }
>
>
>
>
> On Fri, Apr 5, 2013 at 3:33 PM, Geoffrey Myers <
> lists at serioustechnology.com> wrote:
>
>> So, shaking some cobwebs loose here. How do I replace the following:
>>
>> system("echo stuff | somebinary arg1 arg2");
>>
>> With a fork/exec ??
>>
>> (Digging out my old C books....)
>>
>> --
>> From my iPhone
>> Geoffrey Myers
>> _______________________________________________
>> Ale mailing list
>> Ale at ale.org
>> http://mail.ale.org/mailman/listinfo/ale
>> See JOBS, ANNOUNCE and SCHOOLS lists at
>> http://mail.ale.org/mailman/listinfo
>>
>
>
>
> --
>   Ed Cashin <ecashin at noserose.net>
>   http://noserose.net/e/
>   http://www.coraid.com/
>



-- 
  Ed Cashin <ecashin at noserose.net>
  http://noserose.net/e/
  http://www.coraid.com/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.ale.org/pipermail/ale/attachments/20130405/ed83358d/attachment.html>


More information about the Ale mailing list