системный вызов wait () не завершается с помощью ctrl-d - PullRequest
0 голосов
/ 29 сентября 2018

У меня проблемы с назначением, когда я должен использовать различные системные вызовы.Вот инструкции:

1) Ваша программа инициализирует один канал с помощью системного вызова pipe () и вызывает системный вызов fork ()

2) Дочерний процесс подключит канал с помощьюсистемный вызов dup2 () к stdin и запуск bc

3) Родительский процесс будет считывать данные из stdin или файла (как это практикуется в Назначении 1) и отправлять команды дочернему процессу через канал.

4) Родительский процесс будет ожидать завершения дочернего процесса, собирает код возврата дочернего процесса и отображает код возврата в стандартный вывод.

#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, но все еще будете ждать ввода.Любая помощь будет принята с благодарностью.

...