fork () возвращает положительное число вместо нуля - PullRequest
0 голосов
/ 10 мая 2019

У меня проблема с пониманием того, почему fork () возвращает положительное число вместо нуля, когда я использую его только один раз в коде. Я искал решение в течение нескольких часов, но мне ничего не помогло. это код

#include <stdio.h>
#include <stdlib.h> //for exit
#include <fcntl.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h> //for sleep(),execvp()
#include <ctype.h>
#include <fcntl.h>
#define IN 0
#define OUT 1
#define SIZE 9
    int main(int argc, char * argv[]) {
        int pipe_descs[2];
        int matrix[SIZE][SIZE];
        int fdr, fdw;   // file descriptors
        int i;
           int status=0;
        /*if (pipe(pipe_descs) == -1) {
            fprintf(stderr, "cannot open");
            exit(1);
        }*/
                fdr = open(argv[1], O_RDONLY);   // open files
                fdw = open("gg.txt", O_RDWR | O_CREAT | O_TRUNC, 0644);
             if (fdr < 0 || fdw < 0) { //validation for error
                 perror("failed to open input or output files");
                 exit(EXIT_FAILURE);
             }
            removeSpaces(matrix, fdr, fdw);
             status=fork();
            if (status < 0) {
                fputs("error in fork", stderr);
                exit(EXIT_FAILURE);
            }
             if(status == 0) {
                    printf("got to child"); 
                    dup2(pipe_descs[IN],0);
                    close(pipe_descs[IN]);
                    dup2(pipe_descs[OUT],4);
                    close(STDOUT_FILENO);


            }

        close(fdr);   // close the files
        close(fdw);
        exit(EXIT_SUCCESS);
    }

Ответы [ 2 ]

1 голос
/ 10 мая 2019

К моменту возврата fork() у вас работают два (почти) идентичных процесса - родительский и дочерний.Как будто вы запускали вашу программу дважды.

Родительский процесс получает положительный результат от fork () - PID дочернего процесса.Дочерний элемент получает ноль.

Строка "got to child" не печатается, потому что printf буферизует вывод до тех пор, пока не будет напечатан символ новой строки, и вы закроете дескриптор stdout, прежде чем он получит возможность сброситьбуфер.Либо вставьте \n в конце, либо удалите строку close(STDOUT_FILENO).

0 голосов
/ 10 мая 2019

fork() возвращает PID (идентификатор процесса) дочернего элемента при успешном выполнении родительского процесса.-1 при неудаче.См. Этот отрывок из man fork (http://man7.org/linux/man-pages/man2/fork.2.html):

В случае успеха, PID дочернего процесса возвращается в родительском, а 0 возвращается в дочернем. В случае ошибки -1 возвращаетсяв родительском процессе дочерний процесс не создается, и errno устанавливается соответствующим образом.

...