Проблема с использованием execlp для сортировки чисел в файле - PullRequest
0 голосов
/ 08 апреля 2020

Я получаю двойные значения из канала fifo, мой родительский процесс отправляет его через канал своему дочернему процессу, а в дочернем процессе я хочу записать эти числа в .txt (argv [1]), отсортированный с помощью execvp, но вместо отсортированных чисел каждый раз, когда я запускаю код, в тексте .txt пишется «˜ ™ оказываются подтвержденными получателями @ 033333À833333 @».

Я не знаю, в чем проблема, пожалуйста, помогите мне.

Вот код:

#include <sys/stat.h>  
#include <sys/unistd.h>  
#include <sys/types.h>
#include <fcntl.h>  
#include <stdlib.h>  
#include <sys/wait.h>
#include <stdlib.h>
#include <signal.h>
#include <stdio.h>  
#include <errno.h>
#include <string.h>
#include <time.h>
#include <math.h>

int main(int argc, char * argv[]) 
{
    pid_t pid5;
    int fd, fd2;
    double nr;
    int psort[2];

    if(pipe(psort) < 0)
    {
        syserr("pipe");
    }

    setbuf(stdout, NULL);

    if(access("kfifo", F_OK))
    {
        if(mkfifo("kfifo", 0644) < 0)
        {
            syserr("mkfifo");
        }
    }

    if((fd = open("kfifo", O_RDONLY)) < 0)
    {
        syserr("open");
    }

    if((pid5 = fork()) < 0)
    {
        syserr("fork");
    }

    if(pid5 == 0)
    {
        if(close(psort[1]) < 0)
        {
            syserr("close");
        }

        if((fd2 = open(argv[1],  O_CREAT | O_WRONLY | O_TRUNC, 0644)) < 0)
        {
            syserr("open");
        }

        if(dup2(fd2, STDOUT_FILENO) < 0)
        {
            syserr("dup2");
        }

        if(dup2(psort[0], STDIN_FILENO) < 0)
        {
            syserr("dup2");
        }

        execlp("sort", "sort", "-nr", (char*)NULL);

        syserr("execlp");

        exit(1);
    }
    else
    {
        if(close(psort[0]) < 0)
        {
            syserr("close");
        }

        while(read(fd, &nr, sizeof(double)) == sizeof(double))
        {
            //printf("%lf\n", nr);
            if(write(psort[1], &nr, sizeof(double)) < sizeof(double))
            {
                syserr("write");
            }
        }

        if(close(psort[1]) < 0)
        {
            syserr("close");
        }

        close(fd);
        waitpid(pid5, NULL, 0);
        exit(1);
    }

    if(close(psort[0]) < 0)
    {
        syserr("close");
    }

    if(close(psort[1]) < 0)
    {
        syserr("close");
    }

    return 0;
}
...