apue 제6 장 학습 총화

2825 단어 총결산
apue 제6 장 학습 총화
1. 그림자 파일 과 구령
암호 파일 에서 흔히 볼 수 있 는 필드 는 다음 과 같 습 니 다.
root(用户名):x(加密口令):0(uid):0(gid):root(注释字段):/root(用户所在根目录):/bin/bash(用户的shell所在目录)

메모: 이곳 의 암호 화 암 호 는 단지 자리 잡 는 기호 일 뿐 입 니 다. 진정한 암호 화 암 호 는 그림자 파일 에 저장 되 어 있 습 니 다. 그림자 암호 파일 은 일반 사용자 가 읽 을 수 있 는 것 이 아 닙 니 다.몇몇 프로그램 만 암호 화 암 호 를 액세스 해 야 합 니 다. 예 를 들 어 login(1)passwd(1) 이 프로그램 들 은 사용자 ID 를 루트 로 설정 하 는 프로그램 입 니 다.그림자 암 호 를 사용 하면 일반 파일 /etc/passwd 을 사용자 별로 자 유 롭 게 읽 을 수 있 습 니 다.
Liux 에서 다음 코드 는 암호 화 암 호 를 출력 합 니 다 (그림자 암호 파일 에서 끌 어 옵 니 다).
#include "apue.h"
#include <shadow.h>

int main(){
	struct spwd *ptr;
	if((ptr = getspnam("sysublackbear")) == NULL){
		err_sys("getspnam error");
	}
	printf("sp_pwdp = %s
", ptr->sp_pwdp == NULL || ptr->sp_pwdp[0] == 0 ? "(null)":ptr->sp_pwdp); return 0; }

2. 프로그램 을 만 듭 니 다. uname 을 호출 하고 출력 utsname 구조의 모든 필드 를 출력 합 니 다. 이 출력 을 uname -a 명령 의 출력 결과 와 비교 합 니 다.
이 문 제 는 난이도 가 크 지 않 습 니 다. 함수 가 구조 체 를 가리 키 는 지침 에 할당 되 었 을 때 메모리 에 공간 을 분배 하 는 것 을 기억 하 십시오. 그렇지 않 으 면 uname() 함 수 를 호출 할 때 실패 할 수 있 습 니 다.
코드 는 다음 과 같 습 니 다:
#include "apue.h"
#include <sys/utsname.h>

int main() {
    struct utsname* ptr;
    //在调用函数uname时先开辟一块新的空间,如果将指针设为NULL,下面函数不会运行成功,因为系统没有为其开辟内存空间
    ptr = (struct utsname*)malloc(sizeof(struct utsname));
    int temp;
    if(temp = uname(ptr) == -1){
        err_sys("uname error");
    }
    //写成uname -a 的形式
    printf("%s %s %s %s %s
",ptr->sysname == NULL ? "(NULL)" : ptr->sysname, ptr->nodename == NULL ? "(NULL)" : ptr->nodename, ptr->release == NULL ? "(NULL)" : ptr->release, ptr->version == NULL ? "(NULL)" : ptr->version, ptr->machine == NULL ? "(NULL)" : ptr->machine ); return 0; }

3. 현재 시간 을 가 져 오 는 프로그램 을 만 들 고 strftime 출력 결 과 를 date 명령 과 유사 한 기본 출력 으로 변환 합 니 다. 환경 변수 TZ 를 다른 값 으로 설정 하고 출력 결 과 를 관찰 합 니 다.
코드 는 다음 과 같 습 니 다:
#include "apue.h"
#include <time.h>

int main() {
    time_t caltime;
    struct tm *tm;
    char line[MAXLINE];

    //获取当前时间
    if((caltime = time(NULL)) == -1){
        err_sys("time error");
    }
    //将当前时间转换为对应的日历时间,存到tm结构体中
    if((tm = localtime(&caltime)) == NULL){
        err_sys("localtime error");
    }
    //再将日历时间打印成date的格式
    if(strftime(line,MAXLINE,"%a %b %d %X %Z %Y
",tm) == 0){ err_sys("strftime error"); } //打印字符串(将字符数组输出到stdout流当中) fputs(line,stdout); return 0; }

The End

좋은 웹페이지 즐겨찾기