Unix上用C程序实现pipe管道命令“ | “(pipe,fork,dup2,close,execl,重定向)

#include
#include
#include
#include

int main(void){

pid_t childpid;
int fd[2];

if((pipe(fd) == -1) || ((childpid = fork()) == -1)){
//{ int pipe(int filedes[2])}: fd[0]先进先出的读,fd[1]写; pipe函数若成功返回0,否则返回-1
// {pid_t fork()}:在父进程中函数会返回fork出的子进程的pid;在子进程中会返回0
	perror("Fail to setup pipeline");
	return 1;
}

if(childpid == 0){	//说明是子进程(ls)
	if(dup2(fd[1],STDOUT_FILENO) == -1){
		//{int dup2(int oldfd, int newfd)}:将进程的文件描述符定点复制;
		//调用成功返回newfd,否则返回-1
		perror("Fail to redirect stdout of ls");
		//对ls的管道输入fd重定向到标准输出失败
	}else if( (close(fd[0]) == -1) || (close(fd[1]) == -1) ){
		perror("Fail to close extra pipe descriptors on ls");
		//关闭ls的多余管道IO描述符失败
	}else{
		execl("/bin/ls","ls","-l",NULL); //更新子进程用户空间
		perror("Fail to exec ls");
	}
	return 1;//子进程退出,但需要注意此时父进程还未退出
}

//以下是对父进程sort的操作
if(dup2(fd[0],STDIN_FILENO) == -1)
	perror("Fail to redirect stdin of sort");
else if(close(fd[0]) == -1 || close(fd[1]) == -1 )
	perror("Fail to close extra pipe description on sort");
else {
	execl("/bin/sort","sort","-n",NULL); //更新父进程用户空间
	perror("Fail to exec sort");
}
return 1;
}

重定向后的示意图:
Unix上用C程序实现pipe管道命令“ | “(pipe,fork,dup2,close,execl,重定向)_第1张图片

编译后执行,结果和使用命令行敲是一样的,需要关注的地方都写在注释中了。
Unix上用C程序实现pipe管道命令“ | “(pipe,fork,dup2,close,execl,重定向)_第2张图片

你可能感兴趣的:(Unix环境高级编程,unix,linux,操作系统)