wait()系统调用未以ctrl-d终止

时间:2018-09-29 18:55:41

标签: pipe fork exec wait

我在分配作业时遇到麻烦,必须使用各种系统调用。以下是说明:

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接收数据,但仍将等待更多输入。任何帮助将不胜感激。

0 个答案:

没有答案