사용자 관련 정보 검색함수 getutxent()에 대해서
오늘 우연히 사용하게 되어 이에 대한 기록을 남겨놓고 감.

utmp => who 명령어에서 사용함.

wtmp => last 명령어에서 사용함

 

함수를 사용할때 추가해야할 해더파일

#include <utmpx.h>

   

getutxent함수와 관련된 다른 함수들

struct utmpx *getutxent(void);

void setutxent(void);

void endutxent(void);

int utmpxname(const char *file);     => file - 교체할 파일이름이 매개변수로 넘어간다. 

   

 getutxent 함수는 /var/adm/utmpx 파일에서 로그인 정보를 순차적으로 읽어들임.

 setutxent 함수는 /var/adm/utmpx 파일의 오프셋을 파일의 시작에 위치시킴.

 endutxent 함수는 /var/adm/utmpx 위에서 열었던 파일을 닫는다.

 utmpxname 함수는 로그인 정보 파일을 file로 지정한 다른 파일로 변경.

   

해당 정보가 있는 파일의 경로 (각 OS별)

로그파일

Solaris

HP UX

LINUX

wtmp,utmp

/var/adm/wtmpx

/var/adm/utmpx

/usr/adm/wtmp

/etc/utmp

/var/log/wtmp

/var/run/utmp

   

====================================

 

#include "sys/types.h"
#include 
#include 

int main(void) {

    struct utmpx *utx;

    printf("-----------------\n");
    printf("   Login User\n");
    printf("-----------------\n");

    while((utx=getutxent()) != NULL) {
        if(utx->ut_type != USER_PROCESS)
            continue;

        printf("%10s %5s\n", utx->ut_user, utx->ut_line);
    }

    return 0;

}
결과화면
$ ./a.out 
-----------------
   Login User
-----------------
  telcosys  tty1
     fresh pts/4
      jeon pts/3

* who 명령의 결과화면
$ who
telcosys tty1         May 17 09:08
fresh    pts/4        Aug 13 14:34 (10.10.101.55)
jeon     pts/3        Aug 13 19:57 (10.10.104.55)

====================================   

   

utmp파일에는 현재 접속중(Telnet ..) 사용자의 정보가 저장되는데,

로그아웃을 하면 이에 대한 정보가 삭제됨.

   

wtmp파일은 로그인시 utmp파일에 쓰이는 것과 같은 정보가 쓰여지고,

사용자가 로그아웃을 하면 정보도 쓰여지게 됨.(updwtmp).

또한 컴퓨터의 리부팅과, 몇몇정보들이 추가로 쓰여짐.

   

 

원본 source 파일을 첨부해서 살펴보면 아래와 같다.

출처 : http://www2.oldlinux.org/Linux.old/Linux-0.98/Yggdrasil-0.98.3/usr/src/sbin/getty_ps/getutent.c

==========================

 

/* getutxent.c */

#include 
#include 

struct utmpx *
getutxent (void)
{
  return (struct utmpx *) __getutent ();
}
/* getutent.c */


#include "getty.h"

#if defined(RCSID) && !defined(lint)
static char *RcsId =
"@(#)$Id: getutent.c,v 2.0 90/09/19 20:00:51 paul Rel $";
#endif

typedef	struct utmp	UTMP;

static	char	*utmpfil = UTMP_FILE;	/* default utmp file */
static	FILE	*ufp = (FILE *) NULL;	/* file pointer to utmp file */
					/* NULL = no utmp file open  */
static	UTMP	ut;			/* buffer for utmp record */


/*
**	getutent() - get next valid utmp entry
**
**	Returns (UTMP*)NULL if no vaild entry found.
*/

UTMP *
getutent()
{
	if (ufp == (FILE *) NULL)
		if ((ufp = fopen(utmpfil, "r+")) == (FILE *) NULL)
			return((UTMP *) NULL);

	do {
		if (fread((char *)&ut, sizeof(ut), 1, ufp) != 1)
			return((UTMP *) NULL);

	} while (ut.ut_name[0] == '\0');	/* valid entry? */

	return(&ut);
}


/*
**	getutline() - get utmp entry that matches line.
**
**	Returns (UTMP*)NULL if no match found.
*/

UTMP *
getutline(line)
register UTMP *line;
{
	do {
		if (strequal(ut.ut_line, line->ut_line))
			return(&ut);	/* match! */

	} while (getutent() != NULL);

	return((UTMP *) NULL);
}


/*
**	setutent() - rewind utmp back to beginning
*/

void
setutent()
{
	if (ufp != (FILE *) NULL)
		rewind(ufp);
}

/*
**	endutent() - close utmp file
*/

void
endutent()
{
	if (ufp != (FILE *) NULL) {
		(void) fclose(ufp);
		ufp = (FILE *) NULL;
	}
}

/*
**	utmpname() - change utmp file name to "file"
*/

void
utmpname(file)
register char *file;
{
	endutent();
	utmpfil = strdup(file);
}

/* end of getutent.c */

==========================

반응형

'Language > C' 카테고리의 다른 글

strchr 함수 예제  (442) 2012.08.14
strdup 함수 예제  (476) 2012.08.14
strtok 함수 예제  (3377) 2012.08.06
writev 함수 예제  (472) 2012.07.31
readv 함수 예제  (480) 2012.07.30

read 함수와 매우 동일한 함수다. 

다만 다중 버퍼를 사용할 수 있다는 것만 차이점이다. 


NAME

       readv, writev - read or write data into multiple buffers


SYNOPSIS

       #include <sys/uio.h>


       ssize_t readv(int fd, const struct iovec *iov, int iovcnt);



리턴값 : 성공시 전송한 바이트 수, 실패시 -1 리턴

인자값 :

 - fd : 데이터 전송의 목적지를 나타내는 소켓의 파일 디스크립터를 전달한다.

        반드시 소켓에만 제한되는 함수가 아니다. read, write 함수처럼 파일이나

         콘솔을 입, 출력 대상으로 할 수도 있다.

 - vector : 일반적으로 iovec 구조체 배열의 이름을 인자로 전달하는데, iovec 구조체에는

               전송하고자 하는 데이터에 대한 정보가 담겨진다.

 - count : 데이터를 전송하기 위해 참고할 iovec 구조체 변수의 수를 지정한다. 만약에 3이 인자로
              전달되면, vector가 가리키는 iovec 구조체 변수를 시작으로 총 3개의 iovec 변수를 참고하여

               데이터를 전송하게 된다.



iovec (I/O vector)의 구조체는 /etc/include/sys/uio.h 에 선언되어있다.

       

           struct iovec {

               void  *iov_base;    /* Starting address */

               size_t iov_len;     /* Number of bytes to transfer */

           }

 

 

 


 

간략한 예제는 다음과 같다.

=====================================



#include 
#include 
#include 
#include 
#include 

int main ()
{
    char foo[48], bar[51], baz[49];
    struct iovec iov[3];
    ssize_t nr;
    int fd, i;

    fd = open ("test.txt", O_RDONLY);
    if (fd == -1) {
        perror ("open");
        return 1;
    }

    /* set up our iovec structures */
    iov[0].iov_base = foo;
    iov[0].iov_len = sizeof (foo);
    iov[1].iov_base = bar;
    iov[1].iov_len = sizeof (bar);
    iov[2].iov_base = baz;
    iov[2].iov_len = sizeof (baz);

    /* read into the structures with a single call */
    nr = readv (fd, iov, 3);
    if (nr == -1) {
        perror ("readv");
        return 1;
    }

    for (i = 0; i < 3; i++)
        printf ("%d ==>> %s\n", i, (char *) iov[i].iov_base);

    if (close (fd)) {
        perror ("close");
        return 1;
    }

    return 0;
}
시험결과는 다음과 같다.
$ ./a.out 
0 ==>> LONDON ? The swimmer Dana Vollmer is an unabashe?
1 ==>> d fan of the gymnasts Shannon Miller and Nastia LiuLONDON ? The swimmer Dana Vollmer is an unabashe?
2 ==>> kin, which makes sense. Miller and Liukin won Olyd fan of the gymnasts Shannon Miller and Nastia LiuLONDON ? The swimmer Dana Vollmer is an unabashe?

=====================================

3개의 버퍼를 선언하는데 48, 51, 49 byte로 각기 다른 사이즈로 했다.

1번째 줄은 49 byte 출력

2번째 줄은 100byte 출력

3번째 줄은 149byte 출력


버퍼보다 사이즈가 하나 더 늘어나서 출력되는 것 같은데

마지막에 ? (물음표)가 더해졌다. 이유는 아직 잘 모르겠다. OTL.. 

 

 

반응형

'Language > C' 카테고리의 다른 글

strtok 함수 예제  (3377) 2012.08.06
writev 함수 예제  (472) 2012.07.31
poll 함수 예제  (150) 2012.07.26
GCC 컴파일러 에러 메세지 리스트(Error Message List)  (159) 2012.07.24
select 함수 예제  (167) 2012.07.23

+ Recent posts