我的程序应该读取用户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;
}
答案 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" );
}
}
}
...
在这里,如果statements1
和WIFEXITED( 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" );
}
...
免责声明:这些都是正确的,只有WIFEXITED
和WEXITSTATUS
都没有一些全局变量或其他东西,导致它们每次都以某种方式返回不同的值虽然被称为相同的论点,但仍被称为。