正在执行的程序返回相同的值

时间:2014-03-07 18:54:10

标签: c process

我的程序应该读取用户ID和密码,创建一个新进程来运行VALIDATE程序(在文件validate.c中),向VALIDATE程序发送用户ID和密码,并打印一条消息"密码已验证"如果用户ID和密码匹配或者“#34;密码无效"或"没有这样的用户"取决于验证程序的返回值。

我的代码几乎可以做所有事情,但我不知道如何实现关于打印消息的最后部分"密码已验证"如果用户ID和密码匹配或者“#34;密码无效"或"没有这样的用户"取决于验证程序的返回值....它总是打印我的密码验证,即使它不是...... ..任何帮助将不胜感激。对不起,如果这是一个太简单的问题......我是C的初学者。任何帮助都将受到赞赏......谢谢....

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #define MAXLINE 256
    #define MAXPASSWD 10

    void strip( char *str, int capacity ) {
        char *ptr;
        if ( ( ptr = strchr( str, '\n' ) ) == NULL ) {
            str[capacity - 1] = '\0';
        }
        else {
            *ptr = '\0';
        }
    }


    int main( void ) {
        char userid[MAXLINE];
        char password[MAXLINE];
        pid_t pid;
        int fd[2];
        /* Read a user id and password from stdin */
        printf( "User id:\n" );
        if ( ( fgets( userid, MAXLINE, stdin ) ) == NULL ) {
            fprintf( stderr, "Could not read from stdin\n" );
            exit( 1 );
        }
        strip( userid, MAXPASSWD );
        strip( userid, MAXPASSWD );

        printf( "Password:\n" );
        if ( ( fgets( password, MAXLINE, stdin ) ) == NULL ) {
            fprintf( stderr, "Could not read from stdin\n" );
            exit( 1 );
        }
        strip( password, MAXPASSWD );
        pipe( fd );
        pid = fork( );
        if ( pid == -1 ){
            printf( "Error making process\n" );
            return ( -1 );
        }
        if (pid==0){
                close(fd[0]);
                printf("Hey I am the child with pid: %d\n",getpid());
                execl("/h/u15/c2/00/c2rsaldi/csc209labs/ex5/validate.c","validate.c", NULL);           

     }    
    /*Your code here*/
   int status;   

    if (pid>0){
              close(fd[1]);
               write(fd[1],password,(strlen(password)-1));
               write(fd[1],userid,(strlen(userid)-1));
         if (waitpid(pid,&status,0)==0){
            if (WIFEXITED(status) && !WEXITSTATUS(status)){
                      if (WEXITSTATUS(status)==3){
                                 printf(" No such a user\n");
    }  else if (WEXITSTATUS(status)==2){
                                printf("Invalid password");
    }else
                                 printf("Password verified\n");
}

}

}




return 0;
}

1 个答案:

答案 0 :(得分:1)

我不知道你的Validate.c究竟是什么,因此无法了解你的条件是否正常。但我知道这一点:

...
    if ( WIFEXITED( status ) && WEXITSTATUS( status ) ){
        //statements1
        printf( "Password verified\n" );
    }
    else if ( WIFEXITED( status ) && WEXITSTATUS( status ) ){
        //statements2
        if ( WEXITSTATUS( status ) == 3 ){
            printf( " No such a user\n" );
        }
        else if ( WIFEXITED( status ) && WEXITSTATUS( status ) ){
            if ( WEXITSTATUS( status ) == 2 ){
                printf( "Invalid password" );
            }
        }
    }
...

在这里,如果statements1WIFEXITED( status )都是非零值,则告诉您的计算机执行标记为WEXITSTATUS( status )的块,这意味着 true 。否则,意味着这两个 中的任何一个 为零,您要求计算机再次检查这两个,并执行我标记为statements2的块,如果两者都非零。

statements2块可能永远不会被执行,因为它将在条件首次为假的条件下执行,然后突然变为真。

除非有其他错误,否则在if ( WIFEXITED( status ) && WEXITSTATUS( status ) )之后删除else应该可以解决您的问题。您也可以将其带入以下形式,这相当于:

...
    if ( WIFEXITED( status ) && WEXITSTATUS( status ) ){
        printf( "Password verified\n" );
    }
    else if ( WEXITSTATUS( status ) == 3 ){
        printf( " No such a user\n" );
    }
    else if ( WIFEXITED( status ) && WEXITSTATUS( status ) ){
        if ( WEXITSTATUS( status ) == 2 ){
            printf( "Invalid password" );
        }
    }
...

那么,那里有另一个问题......由于同样的原因,可能永远不会访问第二个else if的内容。您可能还必须删除if ( WIFEXITED( status ) && WEXITSTATUS( status ) )。等价地:

...
    if ( WIFEXITED( status ) && WEXITSTATUS( status ) ){
        printf( "Password verified\n" );
    }
    else if ( WEXITSTATUS( status ) == 3 ){
        printf( " No such a user\n" );
    }
    else if ( WEXITSTATUS( status ) == 2 ){
        printf( "Invalid password" );
    }
...

免责声明:这些都是正确的,只有WIFEXITEDWEXITSTATUS都没有一些全局变量或其他东西,导致它们每次都以某种方式返回不同的值虽然被称为相同的论点,但仍被称为。