
int32 와 uint32의 범위?
2^31 -1 >= int32 >= -(2^31)
2^32 -1 >= uint32 >= 0
priority bit가 -8~+8이면 몇 비트가 Qtab에 있는 것?
5비트 (11000 ~ 01000)
아래 함수들의 인자들이 bad numbers가 아닌지 확인하는 macro?
pid32 getfirst(qid16 q)
pid32 getlast(qid16 q)
pid32 getitem(pid32 pid)
isbadqid(q)를 getfirst와 getlast의 시작점에서 불러준다. 그 후에, isbadpid(x)를 getitem에서 불러준다.
#define isbadpid(x)
( ((pid32) (x) < 0 || ((pid32) (x) >= NPROC) ||
(proctab[(x)].prstate == PR_FREE) )
/* pid가 0보다 작거나 NPROC 이상일 때,
(즉, proc table 범위를 넘어섰을 때)
혹은 이미 해제된 (PR_FREE) process일 때
*/
#define isbadqid(x) ( ((int32) (x) < 0 || (int32)(x) >= NQENT -1)
/* qid가 0보다 작거나 NQENT 이상일 때,
(즉, Qtab 범위를 넘어섰을 때)
*/
lab4 만들기
$ mkdir temp
temp 폴더 만들어줌
$ cd temp
$ cp /home/xinu/xinu/system/main.c f1.txt
temp로 이동해서 xinu system의 main.c를 f1.txt로 temp 폴더에 복사해옴
$ vi lab4.c
lab4.c를 만들어줌
#include <fcntl.h>
#include <stdio.h>
extern void copy(int, int);
char buffer[2048];
int version = 1;
int main(int argc, char *argv[]) /* argc : 운영체제가 이 프로그램을 실행했을 때 전달되는 인수의 갯수. 프로그램을 실행할 때 인수를 전달받을 수 있음(도스에서 파일 카피, 이동과 같은 명령 시행 시 처럼) argv 갯수 (argv의 첫번째는 무조건 프로그램 실행 경로라서 무조건 1개이상), *argv[] : main 함수에 전달되는 실제적인 데이터. */
{
int fdold, fdnew;
if (argc != 3) { /* 명령 라인의 인수가 3개가 아니면, 에러 */
printf("Usage: a.out f1 f2\n”);
exit(1);
}
fdold = open(argv[1], O_RDONLY); /* open source file argv[1] read only */
if (fdold == -1) { /*fdold 파일 식별자가 반환되지 않았을 때, 에러*/
printf ("cannot open file %s\n", argv[1]);
exit(1);
}
fdnew = creat(argv[2], 0666); /* create target file argv[2] rw for all */
if (fdnew == -1) { /*fdnew 파일 식별자가 생성 되지 않았을 때 에러*/
printf ("cannot create file %s\n", argv[2]);
exit(1);
}
copy (fdold, fdnew); /*fdnew를 fdold로*/
exit(0); /* 정상 종료*/
}
void copy (int old, int new)
{
int count;
while ((count = read(old, buffer, sizeof(buffer))) > 0) /*read(open() 시스템 콜로 열린 파일을 가리키는 파일 지정 번호, 파일에서 읽은 데이터를 저장할 메모리 공간(void *buf), 읽을 데이터의 크기(Byte 단위)) : 파일 읽기 성공했을 때(EOF 아닐 때) 0보다 큰 수
즉, old 파일이 EOF되지 않는다면, while문은 계속 동작*/
write (new, buffer, count); /*write(open() 시스템 콜로 열린 파일을 가리키는 파일 지정 번호, 파일에 쓸 데이터를 저장하고 있는 메모리 공간, 파일에 쓸 데이터의 길이): 파일 쓰기 성공했을 때 0 반환*/
}
/*즉, copy function은 old 파일에서 read해 온 내용을 buffer에 담아 두었다가, new file에 write해주는 역할*/
$ gcc lab4.c
컴파일
$ ./a.out f1.txt f2.txt
lab4.c를 컴파일해서 a.out이 생긴 것인데, 위 코드의 매개변수로 f1.txt와 f2.txt를 주면, 아무것도 나타나지 않고 f2.txt에 f1.txt내용이 copy됨

grep 명령어
grep NPROC *
$ cp -r xinu xinu_lab5