第一题:现在有2个.c 文件 1.c负责输入2个非0数,a 和 b 2.c负责找出 a 到 b 之间的所有质数 要求使用无名管道实现 第二题:创建一对父子 父进程负责输入一串字符串 子进程负责判断这串字符串是否为回文字符串
1.c文件:
#include<myheadIO.h>
int main(int argc, const char *argv[])
{
int arr[2];
int res=pipe(arr);
if(res==-1)
{
perror("pipe");
return 1;
}
res=fork();
if(res>0)
{
close(arr[0]);
int a=0,b=0;
printf("请输入非0数a:");
scanf("%d",&a);
printf("请输入非0数b:");
scanf("%d",&b);
write(arr[1],&a,8);
write(arr[1],&b,8);
}else
{
char arr0[16]={0};
char arr1[16]={0};
sprintf(arr0,"%d",arr[0]);
sprintf(arr1,"%d",arr[1]);
execl("./11","11",arr0,arr1,NULL);
}
return 0;
}
11.c文件:
#include<myheadIO.h>
//判断一个数是否为质数的函数
int isZhi(int a)
{
for(int i=2;i<a;i++)
{
if(a%i==0)
{
return 0;
}
}
return 1;
}
int main(int argc, const char *argv[])
{
int rfd=atoi(argv[1]);
int wfd=atoi(argv[2]);
close(wfd);
int a=0,b=0;
read(rfd,&a,8);
read(rfd,&b,8);
//printf("%d %d\n",a,b);
printf("a到b之间的所有质数:");
for(int i=a;i<=b;i++)
{
if(isZhi(i))
{
printf("%d ",i);
}
}
putchar(10);
return 0;
}
要编译11.c文件生成11可执行文件之后再运行1.c生产的可执行文件即可达到效果:
第二题:创建一对父子 父进程负责输入一串字符串 子进程负责判断这串字符串是否为回文字符串
#include<myheadIO.h>
#include<string.h>
int main(int argc, const char *argv[])
{
int arr[2];
int res=pipe(arr);
if(res==-1)
{
perror("pipe");
return 1;
}
res=fork();
if(res>0)
{
close(arr[0]);
char buf[64];
while(1)
{
scanf("%s",buf);
//printf("%s",buf);
//printf("%ld",strlen(buf));
write(arr[1],buf,sizeof(buf));
usleep(1000);
}
}else if(res==0)
{
close(arr[1]);
char buf[64];
while(1)
{
int i=0,j=0;
read(arr[0],buf,sizeof(buf));
int len=strlen(buf);
for(i=0,j=len-1;i<j;i++,j--)
{
if(buf[i]!=buf[j])
{
printf("字符串\"%s\"不是回文字符\n",buf);
break;
}
}
if(i>=j)
{
printf("字符串\"%s\"是回文字符\n",buf);
}
}
}
return 0;
}
第三题:创建一对父子进程,父进程循环输出A,子进程循环输出a,使用信号灯集同步这对父子进程,实现效果A_a_A_a_A_a······_表示休眠一秒
#include<myheadIO.h>
void semwait(int id,int index)
{
struct sembuf buf={index,-1,SEM_UNDO};
semop(id,&buf,1);
}
void sempost(int id,int index)
{
struct sembuf buf={index,1,SEM_UNDO};
semop(id,&buf,1);
}
int main(int argc, const char *argv[])
{
//ipc_t2
int fd=open("./ipc_tt2",O_EXCL|O_CREAT,0666);
if(fd!=-1)
{
close(fd);
}
key_t key=ftok("./ipc",3);
int semid=semget(key,1,IPC_CREAT|0666);
semctl(semid,0,SETVAL,0);
semctl(semid,1,SETVAL,1);
int pid=fork();
if(pid>0)
{
while(1)
{
semwait(semid,1);
printf("A_");
fflush(stdout);
sleep(1);
sempost(semid,0);
}
}else if(pid==0)
{
while(1)
{
semwait(semid,0);
printf("a_");
fflush(stdout);
sleep(1);
sempost(semid,1);
}
}
return 0;
}
第四题:使用消息队列+信号集实现2个终端之间的相互聊天功能
终端1代码文件
#include<myheadIO.h>
#include<string.h>
typedef struct msgbuf
{
long type;
char text[99];
}msg;
//信号灯集的加减操作封装
void semwait(int id,int index)
{
struct sembuf buf={index,-1,SEM_UNDO};
semop(id,&buf,1);
}
void sempost(int id,int index)
{
struct sembuf buf={index,1,SEM_UNDO};
semop(id,&buf,1);
}
void handler(int signum)
{
key_t key=ftok("./ipc",1);
if(key==-1)
{
perror("ftok");
}
int msgid=msgget(key,IPC_CREAT|0666);
if(msgid==-1)
{
perror("msgid");
}
msgctl(msgid,IPC_RMID,0);
exit(0);
}
void* read_fun()
{
//信号灯集的创建
key_t sem_key=ftok("./ipc",3);
int sem_id=semget(sem_key,2,IPC_CREAT|0666);
semctl(sem_id,0,SETVAL,0);
key_t key=ftok("./ipc",2);
if(key==-1)
{
perror("ftok");
return NULL;
}
int msgid=msgget(key,IPC_CREAT|0666);
if(msgid==-1)
{
perror("msgget");
return NULL;
}
while(1)
{
semwait(sem_id,1);
msg buf={0};
//buf.type=2;
msgrcv(msgid,&buf,sizeof(buf.text),2,0);
printf("\b\b\b\b\b终端二的消息:%s\n",buf.text);
}
}
int main(int argc, const char *argv[])
{
signal(SIGINT,handler);
int fd=open("./ipc",O_EXCL|O_CREAT,0666);
if(fd!=-1)
{
close(fd);
}
int pid=fork();
if(pid>0)
{
//信号灯集的创建
key_t sem_key=ftok("./ipc",3);
if(sem_key==-1)
{
perror("sem_key");
return 1;
}
int sem_id=semget(sem_key,2,IPC_CREAT|0666);
if(sem_id==-1)
{
perror("sem_id");
return 1;
}
semctl(sem_id,0,SETVAL,0);
//消息队列的创建
key_t key=ftok("./ipc",1);
if(key==-1)
{
perror("ftok");
return 1;
}
int msgid=msgget(key,IPC_CREAT|0666);
if(msgid==-1)
{
perror("msgid");
return 1;
}
//msgctl(msgid,IPC_RMID,0);
while(1)
{
msg buf1={0};
buf1.type=1;
printf("终端一发送:");
fflush(stdout);
scanf("%s",buf1.text);
while(getchar()!='\n');
msgsnd(msgid,&buf1,strlen(buf1.text),0);
sempost(sem_id,0);
}
}else if(pid==0)
{
read_fun();
}
return 0;
}
终端2代码文件
#include<myheadIO.h>
#include<string.h>
typedef struct msgbuf
{
long type;
char text[99];
}msg;
//信号灯集的加减操作封装
void semwait(int id,int index)
{
struct sembuf buf={index,-1,SEM_UNDO};
semop(id,&buf,1);
}
void sempost(int id,int index)
{
struct sembuf buf={index,1,SEM_UNDO};
semop(id,&buf,1);
}
void* read_fun()
{
key_t sem_key=ftok("./ipc",3);
int sem_id=semget(sem_key,2,IPC_CREAT|0666);
semctl(sem_id,0,SETVAL,0);
key_t key=ftok("./ipc",1);
if(key==-1)
{
perror("ftok");
return NULL;
}
int msgid=msgget(key,IPC_CREAT|0666);
if(msgid==-1)
{
perror("msgget");
return NULL;
}
while(1)
{
semwait(sem_id,0);
msg buf={0};
//buf.type=1;
msgrcv(msgid,&buf,sizeof(buf.text),1,0);
printf("\b\b\b\b\b\b终端一的消息:%s\n",buf.text);
}
}
void handler(int signum)
{
key_t key=ftok("./ipc",2);
if(key==-1)
{
perror("ftok");
}
int msgid=msgget(key,IPC_CREAT|0666);
if(msgid==-1)
{
perror("msgid");
}
msgctl(msgid,IPC_RMID,0);
exit(0);
}
int main(int argc, const char *argv[])
{
signal(SIGINT,handler);
int fd=open("./ipc",O_EXCL|O_CREAT,0666);
if(fd!=-1)
{
close(fd);
}
int pid=fork();
if(pid>0)
{
key_t sem_key=ftok("./ipc",3);
int sem_id=semget(sem_key,2,IPC_CREAT|0666);
semctl(sem_id,0,SETVAL,0);
key_t key=ftok("./ipc",2);
if(key==-1)
{
perror("ftok");
return 1;
}
int msgid=msgget(key,IPC_CREAT|0666);
if(msgid==-1)
{
perror("msgid");
return 1;
}
//msgctl(msgid,IPC_RMID,0);
while(1)
{
msg buf2={0};
buf2.type=2;
printf("终端二发送:");
fflush(stdout);
scanf("%s",buf2.text);
while(getchar()!='\n');
msgsnd(msgid,&buf2,strlen(buf2.text),IPC_NOWAIT);
sempost(sem_id,1);
}
}else if(pid==0)
{
read_fun();
}
return 0;
}
运行结果:和预计效果差点儿,脑袋想破了,有没有人知道接受完消息怎么把输出提示语显示出来,麻烦评论告诉我,谢谢啦~还有这个\b和中文的规则是什么啊???·。·??