我在分配作业时遇到麻烦,必须使用各种系统调用。以下是说明:
1)您的程序将使用pipe()系统调用初始化一个管道,然后调用fork()系统调用
2)子进程将使用dup2()系统调用将管道连接到stdin并启动bc
3)父进程将从stdin或文件(如作业1所述)中读取数据,并通过管道将命令发送给子进程。
4)父进程将等待子进程终止,收集子进程返回码,并将返回码显示到stdout。
#include<stdio.h>
#include<unistd.h>
#include<sys/syscall.h>
#include<sys/types.h>
#include<sys/wait.h>
int main(int argc, char *argv[]) {
FILE *fin = stdin;
printf("Assignment 2: Forks and pipes by Mariah Bleak\nPlease provide a$
pid_t p;
int fp[2];
int num[3];
pipe(fp);
p = fork();
dprintf(fp[1], "scale = 4\n");
if( p < 0 ) {
perror("Creating process");
return -1;
}
if( p == 0 ) { //Child Process
close(fp[1]);
dup2(fp[0], STDIN_FILENO);
close(fp[0]);
execlp("bc", "bc", NULL);
}
else { //Parent Process
FILE *fin = fdopen(fp[0], "r");
close(fp[0]);
if (argc > 1) {
fin = fopen(argv[1], "r");
}
if (fin == NULL) {
printf("Could not open %s\n", argv[1]);
perror("trying to open file");
return -1;
}
while (fscanf(fin, "%d %d %d", &num[0], &num[1], &num[2]) == 3)$
write(fp[1], "(num[0]*num[1])/num[2]", sizeof("((num[0]* num[1]$
close(fp[0]);
close(fp[1]);
}
int ret;
wait(&ret);
printf("Child returned %d\n", WEXITSTATUS(ret));
}
return 0;
}
运行程序时,它不会停止使用Ctrl-D接收数据,但仍将等待更多输入。任何帮助将不胜感激。