我必须在父进程中获取用户输入数字'n',然后将其传递给子进程。子进程然后获取'n'个用户输入值并将它们存储在数组中。然后调用一个线程并将此数组作为参数发送。线程对数组中的所有值进行求和,并将其发送回打印它的子进程。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<pthread.h>
#include<fcntl.h>
void *sum(void *a)
{printf("in thread" );
int * arr=(int *)a;
int i;
int sum=0;
int size=sizeof(arr)/sizeof(arr[0]);
for(i=0;i<size;i++)
{
sum=sum +arr[i];
}
pthread_exit(sum);
}
int main()
{
int pipefd[2];
pid_t childpid;
pthread_t tid;
pipe(pipefd);
int r;
int n;
childpid=fork();
if (0==childpid)
{
printf("in child process" );
close(pipefd[1]);
read(pipefd[0],r,sizeof(int));
close(pipefd[0]);
int *ret;
int a[r];
int i;
for (i = 0; i <r; i++)
{ printf("enter values: ");
scanf("%d",&a[i]);
}
pthread_create(&tid,NULL,sum,(void *)a);
pthread_join(tid,(void *)&ret);
printf("%d",*ret );
}
else
{ printf("in parent process" );
printf("enter a number" );
scanf("%d",&n);
close(pipefd[0]);
write(pipefd[1],n,sizeof(int));
close(pipefd[1]);
}
return 0;
}
我已经检查了这个代码十几次,似乎没有什么错。这个过程在取得'n'的值后停止。子进程永远不会运行。
答案 0 :(得分:0)
read
和write
都希望接收要使用的缓冲区的内存地址。您需要获取您尝试填充的变量的地址。
E.g。
write(pipefd[1], &n, sizeof(int));
和
read(pipefd[0], &r, sizeof(int));
顺便说一下,子进程很可能正在运行。只是r
的价值回归为0.简单的调试技巧:使用fprintf(stderr, "stuff to print");
检查各个阶段的结果。例如,您可以轻松验证子进程是否正在运行。