Beispiel #1
0
pid_t forkchild_fd(int *sin, int *sout, int *serr,
	const char *path, char * const argv[])
{
	pid_t pid;
	int sinfds[2];
	int soutfds[2];
	int serrfds[2];

	if((sin && pipe(sinfds))
	  || (sout && pipe(soutfds))
	  || (serr && pipe(serrfds)))
		return -1;
	if(sin) *sin=sinfds[1];
	if(sout) *sout=soutfds[0];
	if(serr) *serr=serrfds[0];
	pid=do_forkchild(sin?sinfds[0]:-1, sout?soutfds[1]:-1,
		serr?serrfds[1]:-1, path, argv);
	if(sin) close(sinfds[0]);
	if(sout) close(soutfds[1]);
	if(serr) close(serrfds[1]);
	return pid;
}
Beispiel #2
0
pid_t forkchild(struct fzp **sin, struct fzp **sout, struct fzp **serr,
	const char *path, char * const argv[])
{
	pid_t pid;
	int sinfds[2];
	int soutfds[2];
	int serrfds[2];

	if((sin && pipe(sinfds))
	  || (sout && pipe(soutfds))
	  || (serr && pipe(serrfds)))
		return -1;
	if((sin && !(*sin=fzp_dopen(sinfds[1], "w")))
	  || (sout && !(*sout=fzp_dopen(soutfds[0], "r")))
	  || (serr && !(*serr=fzp_dopen(serrfds[0], "r"))))
		return -1;
	pid=do_forkchild(sin?sinfds[0]:-1, sout?soutfds[1]:-1,
		serr?serrfds[1]:-1, path, argv);
	if(sin) close(sinfds[0]);
	if(sout) close(soutfds[1]);
	if(serr) close(serrfds[1]);
	return pid;
}
Beispiel #3
0
pid_t forkchild_no_wait(FILE **sin, FILE **sout, FILE **serr,
	const char *path, char * const argv[])
{
	return do_forkchild(sin, sout, serr, path, argv, 0 /* do not wait */);
}
Beispiel #4
0
pid_t forkchild(FILE **sin, FILE **sout, FILE **serr,
	const char *path, char * const argv[])
{
	return do_forkchild(sin, sout, serr, path, argv, 1 /* wait */);
}