2016-07-14 9 views
0
以上
int main(void){ 
int n, user_length; 
char userid[30]; 
char password[11]; 

if ((n = read(STDIN_FILENO, userid, 10)) == -1) { 
    perror("read"); 
    exit(1); 
} else if(n == 0) { 
    fprintf(stderr, "Error: could not read from stdin"); 
    exit(1); 
} 
if (userid[n-1] == '\n') 
    userid[n-1] = '\0'; 
else 
    userid[n] = '\0'; 

if ((n = read(STDIN_FILENO, password, 10)) == -1) { 
    perror("read"); 
    exit(1); 
} else if (n == 0) { 
    fprintf(stderr, "Error: could not read from stdin"); 
    exit(1); 
} 
if (password[n-1] == '\n') 
    password[n-1] = '\0'; 
else 
    password[n] = '\0'; 

strcat(userid, ":"); 
user_length = strlen(userid); 
strcat(userid, password); 
FILE *fp = fopen(PASSWORD_FILE, "r"); 
if (!fp) { 
    perror("fopen"); 
    exit(1); 
} 
char line[MAXLINE]; 
while(fgets(line, sizeof(line) - 1, fp)) { 
    line[strlen(line) - 1] = '\0'; 
    if (strcmp(userid, line) == 0) 
     exit(0); // found match 
    else if(strncmp(userid, line, user_length) == 0) 
     exit (2); // invalid password 
} 
exit(3); // no such user 
} 

がvalidate.cの実装ですが、どのように私は、このような(パイプを使用して、関数にユーザーIDやパスワードなどの値を渡すかを使用して別の関数へのパラメータ)、dup2のかEXECL()パスC

は私がfollowing`

int main(void) { 
    char userid[10]; 
    char password[10]; 
    int pid; 
    int p[2][4]; 
    char other[MAXSIZE]; 

/* Read a user id and password from stdin */ 
    printf("User id:\n"); 
    scanf("%s", userid); 
printf("Password:\n"); 
scanf("%s", password); 
/*Your code here*/ 
if (pipe(p[1]) == -1) { 
    perror("pipe"); 
} 
if (pipe(p[0]) == -1) { 
    perror("pipe"); 
} 
pid = fork(); 
if (pid != 0) { 


    close(p[1][0]); 
    close(p[0][0]); 

    dup2(p[1][1],STDIN_FILENO); 
    dup2(p[0][1],STDIN_FILENO); 

    close(p[1][1]); 
    close(p[0][1]); 


    int status; 
    if (wait(&status)!= -1) { 
    if (WIFEXITED(status)) { 
     printf("[%d] Child exited with %d\n", getpid(), WEXITSTATUS(status)); 
     switch(WEXITSTATUS(status)){ 
     case 0: 
      printf("found match\n"); 
      break; 
     case 2: 
      printf("invalid password\n"); 
      break; 
     case 3: 
      printf("No such user\n"); 
      break; 
     default: 
      printf("error has occur\n"); 
      break; 
     }; 

    } else { 
     printf("[%d] Child exited abnormally\n", getpid()); 
    } 
    } 
} else if (pid == 0) { 

    close(p[1][1]); 
    close(p[0][1]); 
    dup2(p[1][0], fileno(stdout)); 
    dup2(p[1][0], fileno(stdout)); 
    execl("validate",other); 
    printf("what\n"); 

    close(p[1][0]); 
    close(p[0][0]); 

} else { 
    perror("fork"); 
    exit(1); 
} 
return 0; 

}

を使用しかし、入力を再入力するためのプロンプトはいつも私に尋ねます。私が書いたexecl()は単純にvalidate.c関数を呼び出しています)

+0

パイプ、dup2とexeclを使用して、別のプロセスを起動し、あるプロセスのstdoutを他のプロセスのstdinにリダイレクトしようとしています。これらが2つの異なるプロセスでなければならない理由はありますか?プログラム内に別のファイルが必要な場合は、これは正しい方法ではありません –

+0

パイプが後方に見えます。 – melpomene

+0

2つの異なるプロセスはありません。一方は親プロセスを表し、もう一方は子プロセスを表します。このプログラムのファイルは許可されていません –

答えて

1

私が言ったように、このアプローチは間違っていますか?(注:私は "execl"を "validate"あなたはおそらくこのために別のプロセスを生成する必要はありませんが、execlを呼び出す方法にはエラーがあります。

この:

execl("validate",other); 

は次のようになります。

execl(filename,list of arguments, NULL); 

This is the documentation page。彼らはNULLを使用するのと同じ(char *)0を使用します。

+0

私は、私が使用するはずの値に設定していないので、「その他」は役に立たないと思います。一方、validateのmain()関数は引数を取らないので、execlにはどのパラメータも含めるべきではないと私は考えています。 –

+0

次に、otherの代わりにNULLを渡します。これはコードの問題ではないかもしれませんが、c NULLは配列の終わりに達したときに関数に指示しますので、重要です –