IPC进程间通信——pipe

パイプ:半双工;只能用于父子进程或兄弟进程之间的通信

Sample code

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/sem.h>
    
#define MAXLINE 80

struct semun
{
    int val;
};

int sem_init();	// セマフォを初期化

void sem_post();	// セマフォ値 + 1

void sem_wait();	// セマフォ値 - 1

void sem_destroy();	// セマフォを破棄



int main(void)
{
	int n;
	int fd[2];
	pid_t pid;
	char line[MAXLINE];	
   	char buf1[] = " A---->B ";
   	char buf2[] = " B---->A ";
   	
	/* セマフォの初期化 */
	int s1 = sem_init();
	int s2 = sem_init();
	/* パイプを作成 */
	if (pipe(fd) >= 0) {	
		/* 子プロセスの作成 */
		if ((pid = fork()) >= 0){	
			/* 父プロセス */
			if (pid > 0) { 
				
				printf("------------------\n");
				printf("父プロセスの実行 ");
				printf("%d:\n", getpid());
				close(fd[0]); // 1 つのプロセスのみを操作
				n = write(fd[1], buf1, 12);
				if(n < 0){
					printf("エラー:データを入力失敗!\n");
				}else{
					printf("入力:%s\n", buf1);
				}	
				sem_post(s1);
				sem_wait(s2);
				sleep(1);
				printf("父プロセスの実行 ");
				printf("%d:\n", getpid());
				close(fd[1]);
				n = read(fd[0], line, MAXLINE);
				if(n < 0){
					printf("エラー:データを出力失敗!\n");
				}else{
					printf("出力:%s\n",line);
				}
				printf("------------------\n");
			/* 子プロセス */	
			}else { 
				printf("------------------\n");
				sem_wait(s1);
				printf("子プロセスの実行 ");
				printf("%d:\n", getpid());
				close(fd[1]);
				n = read(fd[0], line, MAXLINE);
				if(n < 0){
					printf("エラー:データを出力失敗!\n");
				}else{
					printf("出力:%s\n",line);
				}
			
				close(fd[0]);
				n = write(fd[1], buf2, 12);
				if(n < 0){
					printf("エラー:データを入力失敗!\n");
				}else{	
					printf("入力:%s\n",buf2);
				}
				sem_post(s2);
				printf("------------------\n");
			}
		
		}else{
		
			printf("error:fork!");
			
		}
	
	}else{
	
		printf("error:pipe!");
	
	}
	
	return 0;
}

int sem_init()
{
	int semid = 0;
	semid = semget((key_t)1234,1,IPC_CREAT | 0600);
	if(semid == -1){

	printf("semget error");

	}else{
	struct semun a;
	a.val = 0;
	if(semctl(semid,0,SETVAL,a)==-1)
	{
	    perror("semctl init error");
	}
	}
	return semid;
}

void sem_post(int semid)
{
	struct sembuf buf;
	buf.sem_num = 0;
	buf.sem_op = -1;
	buf.sem_flg = SEM_UNDO;
	if(semop(semid,&buf,1)==-1)
	{
	perror("p error");
	}
}

void sem_wait(int semid)
{
	struct sembuf buf;
	buf.sem_num = 0;
	buf.sem_op = 1;
	buf.sem_flg = SEM_UNDO;
	if(semop(semid,&buf,1)==-1)
	{
	perror("v error");
	}
}

void sem_destroy(int semid)
{
	if(semctl(semid,0,IPC_RMID)==-1)
	{
	perror("semctl destroy error");
	}
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值