パイプ:半双工;只能用于父子进程或兄弟进程之间的通信
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");
}
}