2017-03-07 9 views
0

親プロセスでユーザー入力番号「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; 
} 

はwrong.Theプロセスがn'.The子プロセスが実行されることはありません」の値を取った後に停止するようです。

答えて

0

readwriteは両方とも、使用するバッファのメモリアドレスを受け取ることを想定しています。あなたが入力しようとしている変数のアドレスを取る必要があります。

など。ところで

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

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

、子プロセスはほとんど実行されています。 rが0に戻ってくるのはちょうどあなたの価値です。単純なデバッグトリック:fprintf(stderr, "stuff to print");を使用して、さまざまな段階で結果を確認してください。たとえば、子プロセスが実行中であることを簡単に確認できます。

+0

これで、子プロセスのscanf()は動作しません。'enter values 'はn回出現しますが、これらの値を入力する場所はありません。fprintfをスレッド関数に入れてありがとう、今スレッドはatleastです – Ali

+0

これをチェックしてください:http://stackoverflow.com/questions/26687602/stdin-stdout-and-stderr-are-shared-between – Hod

+0

答えは、彼は子プロセスで標準を取ったことはないと言います。子プロセスでユーザー入力をする必要があります。 – Ali

関連する問題