apue 학습 4일째--제1장 기타 내용

7609 단어
며칠 전 주말인데다 사장이 특허 개편을 재촉하면서 시간이 좀 지체되어 계속 시작했다.
먼저, 실례'그림 1-4', copy standard input to standard output(ps: 중국어 버전을 보는 것이 어색해지는 것을 점점 발견하고 있다).
<span style="font-family:SimHei;font-size:18px;">n = read(STDIN_FILENO, buf, BUFFSIZE)</span>

char buf[BUFFSIZE]는 말할 것도 없지만 이 BUFFSIZE의 수치는 프로그램의 효율에 영향을 줄 수 있습니다. 이것은 나중에 볼 수 있습니다.이 stdIN을 주로 보면...피레노가 뭔데?의심할 여지없이 이것은 file descriptor (파일 설명자) 이다.새 프로그램을 실행할 때마다 셸은 세 개의 파일 설명자를 엽니다:standard input,standard output,standard error.특수 처리를 하지 않으면 세 개의 파일 설명자가 $ls와 같은 터미널을 가리킨다.그 중 임의로 어떤 파일로 방향을 바꿀 수도 있다. 예를 들어
<span style="font-family:SimHei;font-size:18px;">ls > file.list</span>

이것은 ls의 출력을 파일로 바꾸는 것을 의미합니다.list 출력
stdIN에 대해서는FILENO file descriptor는 대부분의 파일 설명자처럼 프로세스가 접근하고 있는 파일을 표시하는 데 사용되는 작은 비 마이너스 정수입니다. 표준 입력 (일반적으로 키보드입니다. 물론 파일로 바꿀 수도 있습니다) 의 파일 설명자입니다.그것의 정의는 int이며, 파일을 열 수 있는 핸들입니다.여기에 문맥을 말해야 한다. 문맥은 일반 지침과 다르다. 문맥은 하나의 시스템 표지로서 시스템은 그것을 통해 해당하는 메모리 주소로 방향을 바꿀 수 있다. 문맥의 봉인성이 좋고 시스템은 인용 대상에 대한 제어를 강화할 수 있으며 지침처럼 함부로 가리키는 것이 아니다.
그럼 stdINFILENO에 대응하는 함수, 즉 몇 개의 시스템 호출 함수, 예를 들어read, write,lseek,close 등은 책에서 버퍼링이 없는 I/O를 제공했다고 하는데 이 버퍼링은 뒤에 놓고 보세요.
파일 descriptor에 대응하는 시스템 호출 함수를 언급한 이상 stdin과 어떤 차이가 있는지 봅시다!
stdin의 유형은FILE*이고 대응하는 함수는 주로 표준 라이브러리에서 실현된fread, fclose, fwrite 등은 시스템 호출이 아니라 고급 입력과 출력 함수일 뿐File*stream;
stdIN_FILENO, 유형은 int, 위에서 말한 대응하는 것은 의 시스템 호출, 버퍼 없음;
표준 라이브러리의fread 내부는 시스템 호출read를 자연스럽게 봉인합니다.여기까지 말하면 자연히 다 안다.
1-4에 대한 절차는 여기까지 하겠습니다. 다음은 1-5로 들어가겠습니다.
1-5는 1-4와 대동소이하다. 단지 시스템 호출로copy를 실현하는 것이 아니라 표준 I/O 함수를 이용했기 때문에 1-4의 버퍼 크기, 예를 들어 1-4의 버프시즈의 값을 어떻게 선택하는지 걱정할 필요가 없다.
여기서 이 코드를 주로 살펴보자.
<span style="font-family:SimHei;font-size:18px;">c = getc(stdin);</span>

C 표준 라이브러리에는 fgetc, getc, getchar와 유사한 함수들이 대량으로 있다.fgets、gets.차이점은 다음과 같습니다.
(C 언어 구분 추천 중...http://www.cnblogs.com/younes/archive/2010/01/05/1639482.html)
getc, getchar는 모두 fgetc의 매크로 정의를 빌려 이루어진 것이다. 예를 들어 #define getchar() fgetc(stdin)이지만 fgets와 gets는 이런 관계가 없기 때문에 gets(구체적으로 상기 사이트 주소 참조)를 신중하게 사용한다.그래서 우리는 fgetc와 fgets의 차이점만 살펴보자.
<span style="font-family:SimHei;font-size:18px;">int fgetc ( FILE * stream );  //  EOF     
char * fgets ( char * str, int num, FILE * stream );	// stream     num  str ,      ///        num-1   ;    ,fgets       ,       NULL</span>

구체적인 세 개의 get char와 두 개의 get string 간의 차이에 관해서는 상기 페이지를 참고하십시오.
1-4와 1-5는 각각 시스템 호출과 표준 라이브러리 함수 아래의 입력과 출력이다. 다음은 다음 내용을 본다.
아래의 내용은 프로그램과 프로세스, 오류 처리, 사용자 표지, 신호, 시간 등을 포함하고 또 10시가 넘었으니 곧 기숙사로 돌아가야 한다. 먼저 흩어진 기록을 하고 내일 보충한다.
프로그램 1-6:
<span style="font-family:SimHei;font-size:18px;">(long)getpid();</span>

현재 프로세스를 호출합니다. getpid가pid 로 되돌아갑니다.t 데이터 형식은 통상적으로 하나의 정형으로 프로세스 ID를 나타낼 수 있지만 강제로 롱으로 변환하는 것은 그것이 사용할 수 있는 최대 길이이며 이식성을 높일 수 있다.
프로그램 1-7은 표준 입력에서 명령을 읽고 실행하는 프로그램으로 쿠새가 파악해야 할 내용이 비교적 많다고 생각하고 fork, exec(코드에 사용된execlp는 7가지 변체 중 하나에 속한다.http://www.cnblogs.com/mickole/p/3187409.html)、waitpid.
fork 함수에서 새 프로세스를 만듭니다. 호출 함수의 복사본입니다. 하위 프로세스라고 합니다.fork () 는 부모 프로세스에 대해 하위 프로세스 ID를 되돌려주고, 하위 프로세스에 대해서는 0을 되돌려주기 때문에 한 번 호출되고 두 번 되돌려줍니다.
UNIX에서 fork와 그 뒤를 따르는 exec는 다른 운영체제의spawn의 새로운 프로세스입니다. 단지 UNIX에서 이 두 부분을 두 개의 독립된 함수로 나눌 뿐입니다.
1.7절 오류 처리에 대한 질문: the argument to perror is defined with the ISO C attribute const,whereas the integer argument to strerror isn't defined with this attribute.Why?(주로 두 함수perror와strerror의 차이, 여기에 해답을 드리겠습니다.http://www.beej.us/guide/bgnet/output/html/multipage/perrorman.html)
이러한 정의는 다음과 같습니다.
<span style="font-family:SimHei;font-size:18px;">#include <stdio.h>
#include <string.h>   // for strerror()

void perror(const char *s);
char *strerror(int errnum);</span>

다음은 예입니다.
<span style="font-family:SimHei;font-size:18px;">int s;

s = socket(PF_INET, SOCK_STREAM, 0);

if (s == -1) { // some error has occurred
    // prints "socket error: " + the error message:
    perror("socket error");
}

// similarly:
if (listen(s, 10) == -1) {
    // this prints "an error: " + the error message from errno:
    printf("an error: %s
", strerror(errno)); }</span>

이 예시에서 쉽게 알 수 있듯이perror 앞에 자신의 설명을 추가할 수 있다(아직 명확하지 않다).strerror는errnum에 대한 상세한 정보를 되돌려준다. 한 마디로 하면verysimilar이다.
또한 오류는 치명적이고 비치명적이다. 치명적인 오류는 알림이나 로그를 출력하고 복구할 수 없다. 치명적인 오류가 아니라 여러 가지 조치가 있다. 예를 들어 자원과 관련된 비치명적인 오류에 대한 전형적인 복구 작업은'일정 시간 지연한 다음에 다시 시도'이다. 예를 들어 네트워크 연결이 작동하지 않는다면 응용 프로그램은 이런 방법을 사용할 수 있다.짧은 시간 지연 후에 다시 링크를 시도합니다. (일부 응용 프로그램은 지수 보상 알고리즘을 사용하여 매번 교체할 때마다 더 오래 기다립니다.)
1.8 절 사용자 표식
루트와 슈퍼사용자의 사용자 ID는 0입니다. 이것은 지난번에/etc 권한을 흐트러뜨렸을 때 보았습니다.
getuid () 와 getgid () 두 함수는 현재 사용자 ID와 그룹 ID를 볼 수 있습니다.
1.9절 signal(신호)
signals are a technology used to notify a process that some condition has occurred.예를 들어 제로(0) 작업의 신호인 SIGFPE(floating-point exception)입니다.
프로세스는 다음 세 가지 방법으로 신호를 처리합니다.
1. 무시(추천하지 않음)2.시스템 기본값으로 처리(0을 제외한 기본값은 프로세스를 종료)3.신호를 포착하다.
프로그램 1-10 중
<span style="font-family:SimHei;font-size:18px;">static void sig_int(int);    /*our signal-catching function*/
......
if(signal(SIGINT, sig_int) == SIG_ERR)
    err_sys("signal error");</span>

세상에, 이게 뭐야?그래, 한번 보자. 사실은 매우 간단하다.시긴트는 인터럽트 신호야.터미널 키보드에서 신호를 보내는 두 가지 방법: 1)interrupt 키 (ctrl+c, delete) 2)quit 키 (ctrl+\).위의 문장을 이해하려면 분명히 함수 시그널의 정의를 보아야 한다.
이것만 보세요.http://www.tutorialspoint.com/c_standard_library/c_function_signal.htm
<span style="font-family:SimHei;font-size:18px;">void (*signal(int sig, void (*func)(int)))(int)</span>

이것은 signal의 정의입니다. 아주 명확합니다. int sig는 SIGINT, SIGTERM 등 맥로의 값입니다. func는 당연히 앞의 신호를 포착하고 처리하는 함수를 스스로 정의한 것입니다.다음 예제를 참조하십시오.
<span style="font-family:SimHei;font-size:18px;">#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

void sighandler(int);

int main()
{
   signal(SIGINT, sighandler);

   while(1) 
   {
      printf("Going to sleep for a second...
"); sleep(1); } return(0); } void sighandler(int signum) { printf("Caught signal %d, coming out...
", signum); exit(1); }</span>

SIGINT의 신호를 받을 때까지 (우리가 ctrl + c를 눌렀다고 가정하면) 안에 있는 것들을sighandler가 포착하고 실행할 때까지 계속 인쇄합니다.그렇게 간단하구나, 에프엑스에서 아직 분명히 말하지 못했어.
자, 이것이 바로 신호입니다. 다음은 1.10 Time values에 대해 1장에서 소개한 것이 매우 적습니다. UTC(Coordinated Universal Time 세계 시간 조율)를 기억하고 1970.1.1 00:00:00 이후의 초를 기억하고 다른 것은 다시 조사합니다.
다음은 1.11절 시스템 콜스 and library functions 시스템 호출과 라이브러리 함수입니다.
이 안에서 sbrk시스템 호출과malloc 라이브러리 함수를 발견했다. 물론malloc의 실현에 사용되는 것은 sbrk(2)이다. 기본적인malloc의 실현이 마음에 들지 않으면 자신의malloc 함수를 쓸 수 있다.
그래서 시스템콜은 최소한의 인터페이스만 제공하고library function은 복잡한 기능을 제공합니다.
"Library functions aren't entry points into the kernel, although they may involve one or more of the kernel's system calls."예를 들어 printf는library function이고 내부에서 write 시스템 콜을 호출했지만 어떤 함수는strcpy,atoi는 시스템 호출을 사용하지 않습니다.
아래는 긴 분할선이다
————————————————————————————————————————————————————————————————————
자, 제1장을 다 보고 대충 지식을 좀 알았으니 당연히 턱없이 부족하지.길이 아득히 멀구나.

좋은 웹페이지 즐겨찾기