UNIX环境高级编程学习之第十五章进程间通信 – 通过匿名管道实现父子进程同步

Linux/Unix C/C++ xiujie 172℃ 0评论 已收录

UNIX环境高级编程学习之第十五章进程间通信 – 通过匿名管道实现父子进程同步

/* User:Lixiujie  
 * Date:20100819
 * Desc:通过半双工匿名管道实现父子进程同步
 * File:pipePCSync.c
 * gcc pipePCSync.c -o demo
 */  
#include <stdio.h>   
#include <string.h>   
#include <stdlib.h>   
#include <unistd.h>   
#include <errno.h>
/* 定义管道的参数文件描述符 */
static int g_pfd[2] = { -1 },g_cfd[2] = { -1 };
/* 初始化 */
void TELL_WAIT(void){ 
	if (pipe(g_pfd) < 0 || pipe(g_cfd) < 0)
	{
		perror("TELL_WAIT() pipe() failed!");
		exit(1);
	}
}
/* 取消父进程等待 */
void TELL_PARENT(void){ 
	if (write(g_pfd[1], "c", 1) != 1){
		perror("TELL_PARENT write() failed!");
		exit(1);
	}
}
/* 子进程等待父进程 */
void WAIT_PARENT(void){
	char c = '/0';
	if (read(g_cfd[0], &c, 1) != 1){
		perror("WAIT_PARENT read() failed!");
		exit(1);
	}	
	if (c != 'p'){
		perror("WAIT_PARENT read data error!");
		exit(1);
	}
}
/* 取消子进程等待 */
void TELL_CHILD(void){
	if (write(g_cfd[1], "p", 1) != 1){
		perror("TELL_CHILD write failed!");
		exit(1);
	}
}
/* 父进程等待子进程 */
void WAIT_CHILD(void){
	char c = '/0';
	if (read(g_pfd[0], &c, 1) != 1){
		perror("WAIT_PARENT read() failed!");
		exit(1);
	}	
	if (c != 'c'){
		perror("WAIT_PARENT read data error!");
		exit(1);
	}
}
int main(void){
	pid_t pid;
	TELL_WAIT();
	if ((pid = fork()) < 0){
		perror("main fork() failed!");
		exit(1);
	}else if(0 == pid){ // Child
		while (1){
			printf("Child:Hello parent!/n");
			TELL_PARENT();
			sleep(3);
		}
	}else{  // Parent
		while (1){
			WAIT_CHILD();
			printf("Parent:Hello Child!/n");
		}
	}
}

喜欢 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址