创建父子进程,实现父子进程的通话。
1)父进程先发送一句话给子进程,子进程接收打印。
2)子进程发送与句话给父进程,父进程接收后打印。
3)重复1)2)步骤即可。
4)当父进程或者子进程发送quit后,父子进程均要结束。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <sys/wait.h>
// stdin 0
// stdout 1
int main(int argc, const char *argv[])
{
char str[50]="";
char qstr[]="quit";
int sprr[2];
int f1prr[2];
int f2prr[2];
int rl;
char c='a';
if(pipe(sprr)){
perror("spipe:");
return 0;
}
if(pipe(f1prr)){
perror("fpipe:");
return 0;
}
if(pipe(f2prr)){
perror("fpipe:");
return 0;
}
pid_t cpid=fork();
if(cpid){
while(1){
printf("child<——parent:");
fflush(stdout);
scanf(" %s",str);
if(!strcmp(str,qstr)){
write(sprr[1],str,50);
write(f1prr[1],&c,1);
wait(NULL);
exit(10);
}
write(sprr[1],str,50);
write(f1prr[1],&c,1);
read(f2prr[0],&c,1);
bzero(str,50);
read(sprr[0],str,50);
if(!strcmp(str,qstr)){
wait(NULL);
exit(10);
}
printf("parent:%s\n",str);
}
}else{
while(1){
read(f1prr[0],&c,1);
bzero(str,50);
read(sprr[0],str,50);
if(!strcmp(str,qstr)){
exit(10);
}
printf("child:%s\n",str);
printf("parent<——child:");
fflush(stdout);
scanf(" %s",str);
if(!strcmp(str,qstr)){
write(sprr[1],str,50);
write(f2prr[1],&c,1);
exit(10);
}
write(sprr[1],str,50);
write(f2prr[1],&c,1);
}
}
return 0;
}
创建ABC三个线程,要求ABC线程顺序运行,不考虑退出条件。 提示:用三个条件变量
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t mt1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mt2 = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond1 = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond2 = PTHREAD_COND_INITIALIZER;
int flag=0;
void *pt1cell(void *arg)
{
while(1){
if(flag!=0){
pthread_cond_wait(&cond1,&mt1);
pthread_cond_wait(&cond2,&mt2);
}
printf("aa\n");
flag=1;
pthread_cond_broadcast(&cond1);
}
}
void *pt2cell(void *arg)
{
while(1){
if(flag!=1){
pthread_cond_wait(&cond1,&mt1);
}
printf("bbbb\n");
flag=2;
pthread_cond_broadcast(&cond1);
pthread_cond_broadcast(&cond2);
}
}
void *pt3cell(void *arg)
{
while(1){
if(flag!=2){
pthread_cond_wait(&cond2,&mt2);
}
printf("cccccc\n");
flag=0;
pthread_cond_broadcast(&cond2);
}
}
int main(int argc, const char *argv[])
{
pthread_t pt1,pt2,pt3;
pthread_create(&pt1,NULL,pt1cell,NULL);
pthread_create(&pt2,NULL,pt2cell,NULL);
pthread_create(&pt3,NULL,pt3cell,NULL);
pthread_join(pt1,NULL);
pthread_join(pt2,NULL);
pthread_join(pt3,NULL);
return 0;
}