第一题:现在有2个.c 文件 1.c负责输入2个非0数,a 和 b 2.c负责找出 a 到 b 之间的所有质数 要求使用无名管道实现
1.c
int main(int argc, const char *argv[])
{
int arr[2]= {0};
int len =0;
int res = pipe(arr);
if(res ==-1){
perror("pipe");
return 1;
}
res = fork();
if(res>0){
close(arr[0]);
while(1){
double buf[2]={0};
printf("input:");
scanf("%lf %lf",buf,buf+1);
while(getchar()!=10);
write(arr[1],buf,16);
usleep(1000);
}
}else{
execl("./child","child",NULL);
}
return 0;
}
2.c
int main(int argc, const char *argv[])
{
close(4);
while(1){
double buf[2]={0};
read(3,buf,16);
double a = buf[0];
double b = buf[1];
int m = (int)a;
int n = (int)b;
for (int i = m; i <= n; i++)
{
int j = 0;
for (j = 2; j <= i; j++)
{
if (i%j == 0)
{
break;
}
}
if (i == j)
{
printf("%d ", i);
}
}
printf("\n");
}
return 0;
}
第二题:创建一对父子 父进程负责输入一串字符串 子进程负责判断这串字符串是否为回文字符串
int main(int argc, const char *argv[])
{
int arr[2]={0};
int res = pipe(arr);
if(res == -1){
perror("pipe");
return 1;
}
res = fork();
if(res > 1){
close(arr[0]);
while(1){
char buf[100];
printf("input:");
scanf("%s",buf);
while(getchar()!=10);
write(arr[1],buf,sizeof(buf));
usleep(1000);
}
}else if(res == 0){
close(arr[1]);
while(1){
char s[100];
read(arr[0],s,sizeof(s));
int i =0;
int j=strlen(s)-1;
while(i<=j&&s[i]==s[j]){
i++;j--;
}
if (i<=j){
printf("不是回文字符串\n");
}else{
printf("是回文字符串\n");
}
}
}
return 0;
}
第三题: 有2个.c文件,每个.c文件都拥有一对父子进程,总共4个进程 A a B b 现在要求实现一个多米诺骨牌的效果: 按ctrl+c结束a进程的运行,a进程结束运行之前,通过kill函数向b进程发送SIGINT信号,b进程死亡后,B进程回收b进程的资源后,使用kill函数向A进程发送SIGTSTP信号后,结束运行。A进程接受到B进程的SIGTSTP信号后,会后a进程的资源后也结束运行
我是废物
第四题: 使用有名管道,实现2个进程之间的互相聊天 注意:一定是一方可以一直发消息,另一方不回消息,或者在任意时间随意回复几条消息。千万不能是一方发送消息后,去等待另一方的回复后才能发送另一条消息
int main(int argc, const char *argv[])
{
if(access("./myfifo",F_OK)==-1){
mkfifo("./myfifo",0666);
}
if(access("./myfifo1",F_OK)==-1){
mkfifo("./myfifo1",0666);
}
int fd = open("./myfifo",O_WRONLY|O_TRUNC);
int fd1 = open("./myfifo1",O_RDONLY);
printf("管道文件打开成功\n");
int res =fork();
if (res==0){
while(1){
char buf[64]={0};
scanf("%64s",buf);
while(getchar()!=10);
write(fd,buf,strlen(buf));
}
}else{
while(1){
char buf[64]={0};
read(fd1,buf,64);
printf("读取到数据为:%s\n",buf);
}
}
close(fd);
close(fd1);
return 0;
}
int main(int argc, const char *argv[])
{
if(access("./myfifo",F_OK)==-1){
mkfifo("./myfifo",0666);
}
if(access("./myfifo1",F_OK)==-1){
mkfifo("./myfifo1",0666);
}
int fd = open("./myfifo",O_RDONLY);
int fd1 = open("./myfifo1",O_WRONLY|O_TRUNC);
printf("管道文件打开成功\n");
int res = fork();
if(res>0){
while(1){
char buf[64]={0};
read(fd,buf,64);
printf("读取到数据为:%s\n",buf);
}
}else{
while(1){
char buf[64]={0};
scanf("%64s",buf);
while(getchar()!=10);
write(fd1,buf,strlen(buf));
}
}
close(fd);
close(fd1);
return 0;
}