思维导图
使用信号灯集完成三个进程的同步,A进程输出字符A,B进程输出字符B,C进程输出字符C,要求输出结果为ABCABCABCABCABC...
#include<head.h>
#include "test.h"
//定义信号处理函数
void handler(int signum)
{
if(signum == SIGCHLD)
{
//以非阻塞的形式回收僵尸进程,直到所有的僵尸进程全部回收结束
while(waitpid(-1, NULL, WNOHANG) >0 );
}
}
int main(int argc, const char *argv[])
{
//捕获子进程发来的SIGCHLD信号
if(signal(SIGCHLD, handler) == SIG_ERR)
{
perror("signal error");
return -1;
} //11、创建信号灯集
int semid = create_sem(3);
//创建子进程1
pid_t pid1=fork();
if(pid1 > 0)
{
pid_t pid2=fork();
if(pid2==-1)
{
perror("fork 2 error");
return -1;
}
if(pid2>0)
{
//父进程
while(1)
{
//22申请2号灯的资源
P(semid, 2);
printf("A");
fflush(stdout);
V(semid,0);
}
}
else if(pid2==0)
{
//子进程2
while(1)
{
//33申请0号灯的资源
P(semid,0);
printf("B");
fflush(stdout);
V(semid,1);
}
exit(EXIT_SUCCESS);
}
else
{
perror("error pid2");
return -1;
}
}else if(pid1 ==0)
{
//子进程1
while(1)
{
//申请1号灯的资源
P(semid,1);
printf("c");
fflush(stdout);
V(semid,2);
}
exit(EXIT_SUCCESS);
}else
{
perror("error pid1");
return -1;
}
//44、删除信号灯集
delete_sem(semid);
return 0;
}
makefile
EXE=a.out
OBJS=main.c
CC=gcc
CFLAGS=-c -o
all:$(EXE)
$(EXE):$(OBJS)
$(CC) $(OBJS) -L ../lib/ -ltest1 -I ../head/
clean:
@rm $(EXE)