2012-02-28 11:20:27 +08:00
/** \file postfork.h
Functions that we may safely call after fork ( ) , of which there are very few . In particular we cannot allocate memory , since we ' re insane enough to call fork from a multithreaded process .
*/
# ifndef FISH_POSTFORK_H
# define FISH_POSTFORK_H
# include <wchar.h>
# include <signal.h>
# include <unistd.h>
# include <sys/time.h>
# include <list>
# include "config.h"
# include "common.h"
# include "util.h"
# include "proc.h"
# include "wutil.h"
# include "io.h"
2012-08-15 15:57:56 +08:00
# if HAVE_SPAWN_H
# include <spawn.h>
# endif
# ifndef FISH_USE_POSIX_SPAWN
# define FISH_USE_POSIX_SPAWN HAVE_SPAWN_H
# endif
2012-03-01 03:27:14 +08:00
/**
This function should be called by both the parent process and the
child right after fork ( ) has been called . If job control is
enabled , the child is put in the jobs group , and if the child is
also in the foreground , it is also given control of the
terminal . When called in the parent process , this function may
fail , since the child might have already finished and called
exit . The parent process may safely ignore the exit status of this
call .
Returns 0 on sucess , - 1 on failiure .
*/
2012-02-28 11:20:27 +08:00
int set_child_group ( job_t * j , process_t * p , int print_errors ) ;
2012-03-01 03:27:14 +08:00
/**
Initialize a new child process . This should be called right away
after forking in the child process . If job control is enabled for
this job , the process is put in the process group of the job , all
signal handlers are reset , signals are unblocked ( this function may
only be called inside the exec function , which blocks all signals ) ,
and all IO redirections and other file descriptor actions are
performed .
\ param j the job to set up the IO for
\ param p the child process to set up
2012-08-15 15:57:56 +08:00
\ param io_chain the IO chain to use ( ignores the job ' s iochain )
2012-03-01 03:27:14 +08:00
\ return 0 on sucess , - 1 on failiure . When this function returns ,
signals are always unblocked . On failiure , signal handlers , io
redirections and process group of the process is undefined .
*/
2012-02-28 11:20:27 +08:00
int setup_child_process ( job_t * j , process_t * p ) ;
2012-02-29 07:11:46 +08:00
/* Call fork(), optionally waiting until we are no longer multithreaded. If the forked child doesn't do anything that could allocate memory, take a lock, etc. (like call exec), then it's not necessary to wait for threads to die. If the forked child may do those things, it should wait for threads to die.
*/
pid_t execute_fork ( bool wait_for_threads_to_die ) ;
2012-08-15 15:57:56 +08:00
/** Report an error from failing to exec or posix_spawn a command */
void safe_report_exec_error ( int err , const char * actual_cmd , char * * argv , char * * envv ) ;
# if FISH_USE_POSIX_SPAWN
/* Initializes and fills in a posix_spawnattr_t; on success, the caller should destroy it via posix_spawnattr_destroy */
bool fork_actions_make_spawn_properties ( posix_spawnattr_t * attr , posix_spawn_file_actions_t * actions , job_t * j , process_t * p ) ;
# endif
2012-02-28 11:20:27 +08:00
# endif