0

execl を介して別の .c から作成されたパイプからの読み取りに問題があります。私は多くの異なるアプローチでそれを試しましたが、まだ解決策を見つけることができません. 助けていただければ幸いです!

最初のコードは次のとおりです。

... for ループの前の他のコード...

for (counter=0; counter<arithmos; counter++)
   {
       if (pipe(pinakas[counter]) == -1)
       {
           perror("pipe");
           exit(1);
       }
       sem_wait(&sima);
       strcpy(buffer,queueHead(q));
       write(fd[WRITE], buffer, strlen(buffer));
       queueRemove(&q);
       nodes--;
       sem_post(&sima);
       pid = fork();
       if (pid < 0)
       {
           perror("fork error");
           exit(1);
       }
       if (pid == 0)
       {
            execl("./paidi","paidi", (char*)pinakas[counter], (char*)NULL);
            exit(1);
       }
       if (pid > 0)
       {

          printf ("I am the parent with pid %d\n", getpid());
          wait(NULL);

       }
   } 

そして、これが私の子供がすることです...

などが含まれています...

int main(int argc, char **argv)
 {
    //char fd[2];
    int *fd = (int*) argv[1];
    int nbytes;
    char buffer[256];
    char *command;
    int i;

    for (i=0; i<256; i++)
    {
        buffer[i] = '\0';
    }

    printf("test2 %d\n",fd[READ]);
    //close(fd[WRITE]);
    printf("test3\n");
    read(fd[READ], buffer, 256);
    printf("test4\n");
    close(fd[READ]);
    printf("test5\n");
    printf("Received url : %s", buffer );
    printf("test6\n");
    //sprintf(command,"wget %zd", url);
    //system(command);
    printf("I am a child with pid %d\n", getpid());
    return 0;
}

私はexeclで何か間違ったことをしているようです。ポインターを引数として渡そうとしていますが、パイプがあります: 不正なアドレス エラーです。文字列でも試してみましたが、何もありません...アイデアはありますか?

4

1 に答える 1

2

execve(2)ロードされた実行可能ファイル用にまったく新しいメモリ空間を作成します。以前のプログラムからポインタを渡すことはできません。その新しいメモリ空間では意味がありません。

ここでの実証済みのアプローチは、子の標準入力 (ファイル記述子 0) を、 using のpipe(2)後、 usingのfork(2)前のread-end に置き換えることです。execve(2)dup2(2)

于 2012-05-29T15:02:00.470 に答える