| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 | #include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/wait.h>FILE *popen (const char *command, const char *modes){	int pipe_fd[2];	int pid, reading;	if (pipe(pipe_fd) < 0)		return NULL;	reading = (modes[0] == 'r');	pid = vfork();	if (pid < 0) {		close(pipe_fd[0]);		close(pipe_fd[1]);		return NULL;	}	if (pid == 0) {		close(pipe_fd[!reading]);		close(reading);		if (pipe_fd[reading] != reading) {			dup2(pipe_fd[reading], reading);			close(pipe_fd[reading]);		}		execl("/bin/sh", "sh", "-c", command, (char *) 0);		_exit(255);	}	close(pipe_fd[reading]);	return fdopen(pipe_fd[!reading], modes);}int pclose(FILE *fd){	int waitstat;	if (fclose(fd) != 0)		return EOF;	wait(&waitstat);	return waitstat;}
 |