fork()返回正数而不是零

时间:2019-05-10 14:38:34

标签: c process fork

我在理解为什么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 个答案:

答案 0 :(得分:1)

fork()返回时,您正在运行两个(几乎)相同的进程-父进程和子进程。就像您两次运行程序一样。

父进程从fork()-子进程的PID获得正收益。孩子得到零。

由于printf会缓冲输出直到打印换行符,并且在有机会刷新缓冲区之前关闭stdout句柄,因此不会打印“让孩子走”行。在其末尾插入\n,或删除close(STDOUT_FILENO)行。

答案 1 :(得分:0)

fork()在父进程成功时返回子进程的PID(进程ID)。 -1表示失败。请参见man forkhttp://man7.org/linux/man-pages/man2/fork.2.html)的摘录:

  

成功后,子进程的PID将在父进程中返回,   子代返回0。失败时,返回-1   父级,没有创建子进程,并且已正确设置errno。