我的过程没有进入子进程

时间:2017-03-07 20:15:58

标签: pthreads pipe ipc

我必须在父进程中获取用户输入数字'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'的值后停止。子进程永远不会运行。

1 个答案:

答案 0 :(得分:0)

readwrite都希望接收要使用的缓冲区的内存地址。您需要获取您尝试填充的变量的地址。

E.g。

write(pipefd[1], &n, sizeof(int));

read(pipefd[0], &r, sizeof(int));

顺便说一下,子进程很可能正在运行。只是r的价值回归为0.简单的调试技巧:使用fprintf(stderr, "stuff to print");检查各个阶段的结果。例如,您可以轻松验证子进程是否正在运行。