Я получаю двойные значения из канала 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;
}