1.循环打印 ABC
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
sem_t sem1,sem2,sem3;
#define PRINT_ERR(msg) \
do \
{ \
perror(msg); \
return -1; \
}while(0)
void *task1(void *arg)
{
while(1)
{
sem_wait(&sem1);
printf("A ");
sleep(1);
sem_post(&sem2);
}
pthread_exit(NULL);
}
void *task2(void *arg)
{
while(1)
{
sem_wait(&sem2);
printf("B ");
sleep(1);
sem_post(&sem3);
}
pthread_exit(NULL);
}
void *task3(void *arg)
{
while(1)
{
sem_wait(&sem3);
printf("C\n");
sleep(1);
sem_post(&sem1);
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
pthread_t tid1, tid2, tid3;
sem_init(&sem1,0,1);
sem_init(&sem2,0,0);
sem_init(&sem3,0,0);
if (0 != pthread_create(&tid1, NULL, task1, NULL))
PRINT_ERR("task1");
if (0 != pthread_create(&tid2, NULL, task2, NULL))
PRINT_ERR("task2");
if (0 != pthread_create(&tid3, NULL, task3, NULL))
PRINT_ERR("task1");
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
pthread_join(tid3,NULL);
return 0;
}
2.父子进程通信
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
int main(int argc, const char *argv[])
{
int p2c[2] = {0};
int c2p[2] = {0};
pipe(p2c);
pipe(c2p);
char buff[99] = "";
pid_t pid = fork();
if (0 > pid)
{
perror("fork");
return -1;
}
else if (0 == pid)
{
while (1)
{
read(p2c[0], &buff, sizeof(buff));
printf("子进程收到:");
puts(buff);
printf("子进程发出:");
gets(buff);
write(c2p[1], &buff, sizeof(buff));
}
}
else if (0 < pid)
{
while (1)
{
printf("父进程发出:");
gets(buff);
write(p2c[1], &buff, sizeof(buff));
read(c2p[0], &buff, sizeof(buff));
printf("父进程收到:");
puts(buff);
}
}
return 0;
}