This is just a suggestion for how to approach your proposed solution. For the two specific actions you are asking about:
touch
: you can achieve a similar effect by opening and closing the file you want to touch
- be careful not to use the
O_TRUNC
flag on open
ls
: it is a little more painful, because you will need to use dirent.h
on POSIX systems, and walk the results of
opendir
readdir
- make sure to call
closedir
when you are done
If you want to replace the system
and popen
calls with something equivalent using vfork
, there is some care involved. The vfork
call is a little tricky to use, because if the child does anything other than exec
right after the call, you take the chance of corrupting the memory state of the parent.
For your replacement to system
:
- create a helper program to execute the string provided in the arguments
- the helper program can either call
system
on the provided argument, or parse the command string and call exec
- in your
system
replacement function, create an arg vector to call the helper program and passing in the program string you really want executed in as an argument to this program
- after you call
vfork
, you immediately exec
the helper program in the child
- parent waits for child to complete
In your popen
replacement:
- create a helper program that accepts the
stdout
and stdin
file descriptors as arguments, and the string of the command you want to execute
- the helper program will dup the passed in descriptors to
0
or 1
(or both) as indicated by the arguments
- the helper program can execute the string either with
popen
and proxy data between parent and child, or call exec
after parsing the command string
- in your
popen
replacement function, use pipe
to create the stdout
or stdin
communication channel (as per the second popen
function parameter) and create an arg vector to call the helper program, passing in the appropriate file descriptor number and command string as arguments
- after you call
vfork
, you immediate exec
the helper program in the child
- you'll need a
pclose
replacement to reap the child process