Как получить данные из прочитанной программы в основную программу, используя execve и pipe?
Я делаю проект, в котором я должен создать дочерний процесс с помощью fork, а затем родительский процесс сообщает дочернему процессу выполнить другую программу на языке C "read.c"(которая читает все целые числа из файла.txt и вычисляет среднее значение) используя execve, я должен отправить это среднее значение родительскому процессу через канал. Я не знаю, как получить "среднее значение" результата программы "read.c" в дочернем процессе программы "process.c". Некоторые из моих друзей сказали, что мне нужно передать дескриптор файла, полезный для pipe(pfd[2]), в execve, а из другой программы (read.c) мне нужно использовать pipe для записи данных в программу process.c. но я не знаю, как это сделать, чтобы он не работал должным образом. Я публикую свои коды как для process.c, так и для read.c, и, пожалуйста, скажите, какие изменения я должен внести, чтобы он работал хорошо.
process.c
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
main()
{
int pid;
int pfd[2];
int i;
char string1[12];
snprintf(string1,12,"%i",pfd[1]);
char *args[] = {"read",&string1[0],NULL};
pipe(pfd);
pid = fork();
if(pid == 0)
{
execve("read",args,NULL);
int size = 100;
char buf[size];
close(pfd[1]);
read(pfd[0],buf,size);
printf("%s\n",buf);
}
}
read.c
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main (int argc,char *argv[],char *envp[])
{
int pfd[2];
pfd[1]= atoi(argv[1]);
close(pfd[0]);
FILE *ptr_file;
char buf[1000];
int sum = 0;
int avg =0;
int no = 0;
int count = 0;
ptr_file =fopen("data.txt","r");
if (!ptr_file)
return 1;
while (fgets(buf,1000, ptr_file)!=NULL)
{
printf(" %s \n",buf);
no = atoi(buf);
sum = sum + no;
printf("Sum = %d \n", sum);
count++;
}
fclose(ptr_file);
avg = sum/count;
printf("Average : %d \n",avg);
write(pfd[1],"hello",6);/*i just write here hello to see that it is working or not*/
return 0;
}
Если у вас есть какое-либо решение для получения вывода из файла read.c в дочерний процесс process.c, тогда, пожалуйста, сообщите мне.
1 ответ
Ваш "read.c" должен напечатать результат в стандартный вывод. Итак, откройте файл и рассчитайте результат, как вы делаете. Затем используйте printf(), чтобы напечатать результат как этот. Это может быть запущено из командной строки и вывод должен идти в терминал.
printf("%f\n", result);
close (1); // Just in case, Making sure to flush for pipe
Вот код, который устанавливает канал между родителем и потомком. Я думаю, что это должно помочь решить ваш проект.
Снип процесса.c
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main (int argc, char *argv[], char *envp[])
{
int fd[2], pid;
pipe (fd);
pid = fork()
if (pid == 0)
{
/* Child process */
close (1); // Close STDOUT.
dup(fd[1]); // STDOUT will be fd[1]
close (0); // Close STDIN, Don't need this.
close (2); // Close STDERR, Don't need this.
close (fd[0]); // Don't need this.
close (fd[1]); // Don't need this.
execvpe ("./read", argv, envp); // Choose your exec() version
/* exec() family of calls never returns. Process reed executes here. */
}
else
{
/* Parent process executes here */
char chr[256];
float average = 0;
int ret = 0;
/* Parent process. Making it very simple without any dups etc. */
/* No error checks are performed... */
/* You may experiment with enhancements here!!! */
ret = read (fd[0], chr, 255); // Blocking Read syscall
if (ret <= 0)
{
printf ("Error or Nothing is read. Debug the problem!!!\n");
exit (1);
}
chr[ret] = '\0';
printf ("Average from read Child process[PID is %d] = %s\n", pid, chr);
}
}