D4.7
//A B C
#include
<stdio.h>
#include
<stdlib.h>
#include
<unistd.h>
#include
<sys/sem.h>
#include
<sys/ipc.h>
int
main()
{
pid_t pid;
key_t key = ftok("/tmp/sem1",
‘k’);
int semid = semget(key, 3, 0644 |
IPC_CREAT);
if (semid < 0)
{
perror("sem get error!");
exit(1);
}
//鍒濆鍖栦俊鍙烽噺
semctl(semid, 0, SETVAL, 1);
semctl(semid, 1, SETVAL, 0);
semctl(semid, 2, SETVAL, 0);
pid = fork();
if (pid < 0)
{
perror("fork error!");
exit(1);
}
if (pid == 0)
{
pid = fork();
if (pid < 0)
{
perror("fork frok
error!");
exit(1);
}
if (pid == 0)
{
while (1)
{
struct sembuf sem3;
sem3.sem_num = 2;
sem3.sem_op = -1;
sem3.sem_flg = SEM_UNDO;
semop(semid, &sem3, 1);
sleep(1);
printf("C\n");
sleep(1);
struct sembuf sem;
sem.sem_num = 0;
sem.sem_op = 1;
sem.sem_flg = SEM_UNDO;
semop(semid, &sem, 1);
}
}
else if (pid > 0)
{
while (1)
{
struct sembuf sem2;
sem2.sem_num = 1;
sem2.sem_op = -1;
sem2.sem_flg = SEM_UNDO;
semop(semid, &sem2, 1);
sleep(1);
printf("B\n");
sleep(1);
struct sembuf sem3;
sem3.sem_num = 2;
sem3.sem_op = 1;
sem3.sem_flg = SEM_UNDO;
semop(semid, &sem3, 1);
}
}
}
else if (pid > 0)
{
while (1)
{
struct sembuf sem;
sem.sem_num = 0;
sem.sem_op = -1;
sem.sem_flg = SEM_UNDO;
semop(semid, &sem, 1);
sleep(1);
printf("A\n");
sleep(1);
struct sembuf sem2;
sem2.sem_num = 1;
sem2.sem_op = 1;
sem2.sem_flg = SEM_UNDO;
semop(semid, &sem2, 1);
}
}
return 0;
}
进程线程的编程练习题
D4.8
线程间通信