프로세스 개념
프로세스 실행중에 있는 프로그램 ID배정
fork는 프로세스 운영체젱서만 가능하다
fork는 자식 프로세스를 생성을 한다.
예를 들어서 A라는 프로세스가 구구단을 출력하는 프로그램이라고하면
자식 프로세스가 실행이되서
부모프로세스랑  동일한 코드를가지고 실행한다.

그래서 코드내에서 어떤게 부모인가 어떤게 자식인가 구분을 할수 있어야한다.
Fork에서 프로세스를 아이디값을 반환한다.
어떤것이 자식인가 볼려면 포크의 반환값이 0인것을 보면된다.
포크를 호출하고 나서 반환값을 가지고 부모자식간의 값을 구분을 해서
수행을 하면된다.

부모프로세스에서 포크로 자식 프로세스를 생성하면 부모는 포크아이디가 있지만
자식은 포크가없다.

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

main()
{
    pid_t pid;

    /* pid에는 fork의 반환 값이 저장되는데, 호출에 실패했을 경우에는 -1이 저장 */
    if ((pid=fork()) == -1)
       perror("fork failed");
    /* 이 조건이 참인 프로세스는 부모 프로세스인데, 부모 프로세스의
       pid 변수에는 0이 아닌 자식 프로세스의 프로세스 ID가 저장되기 때문 */
    else if (pid != 0)
       printf("parent process\n");
    /* pid가 0이라는 의미가 되므로 현재 프로세스는 자식 프로세스인데,
      자식 프로세스의 pid 변수에는 0이 저장되기 때문 */
    else
       printf("child process\n");
}

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

main()
{
    pid_t pid;

    /* pid에는 fork의 반환 값이 저장되는데, 호출에 실패했을 경우에는 -1이 저장 */
    if ((pid=fork()) == -1)
       perror("fork failed");
    /* 이 조건이 참인 프로세스는 부모 프로세스인데, 부모 프로세스의
       pid 변수에는 0이 아닌 자식 프로세스의 프로세스 ID가 저장되기 때문 */
    else if (pid != 0)
       printf("parent process\n");
    /* pid가 0이라는 의미가 되므로 현재 프로세스는 자식 프로세스인데,
      자식 프로세스의 pid 변수에는 0이 저장되기 때문 */
    else
       printf("child process\n");
}

      c 언어  |  2007. 9. 14. 11:52





프로세스 개념
프로세스 실행중에 있는 프로그램 ID배정
fork는 프로세스 운영체젱서만 가능하다
fork는 자식 프로세스를 생성을 한다.
예를 들어서 A라는 프로세스가 구구단을 출력하는 프로그램이라고하면
자식 프로세스가 실행이되서
부모프로세스랑  동일한 코드를가지고 실행한다.

그래서 코드내에서 어떤게 부모인가 어떤게 자식인가 구분을 할수 있어야한다.
Fork에서 프로세스를 아이디값을 반환한다.
어떤것이 자식인가 볼려면 포크의 반환값이 0인것을 보면된다.
포크를 호출하고 나서 반환값을 가지고 부모자식간의 값을 구분을 해서
수행을 하면된다.

부모프로세스에서 포크로 자식 프로세스를 생성하면 부모는 포크아이디가 있지만
자식은 포크가없다.
----------------------------------------------------------------------

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

main()
{
    /* fork 호출하기 전이므로 현재(부모) 프로세스에서만 한번 실행 */
    printf("one\n");
    /* fork 호출에 의해 자식 프로세스 생성 */
    if (fork() == -1)  /* fork에 실패하면 */
       perror("fork failed");
    else  /* fork에 성공하면 */
       printf("two\n");   /* 부모 프로세스와 자식 프로세스 각각이 실행 */
}

      c 언어  |  2007. 9. 14. 11:48




#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#define MAX 512

main(int argc, char *argv[])
{
   DIR *dp;
   struct dirent *dirp;
   char *dir;
   char filename[MAX];
   char list[MAX];
   char buf[MAX];
   struct stat st;
   int index;
   int i;

   /* 명령라인 인수가 1개라면 현재 작업 디렉토리에 대해 동작 */
   if (argc == 1)
      dir = ".";
   /* 그렇지 않으면 argv[1] 디렉토리에 대해 동작 */
   else
      dir = argv[1];
   if((dp=opendir(dir)) == NULL) {   /* dir 디렉토리 열기 */
      perror("opendir failed");
      exit(1);
   }

   while (dirp=readdir(dp)) {   /* dp 디렉토리의 모든 항목들에 대해 처리 */
      index = 0;
      if (!strncmp(dirp->d_name, ".", 1))   /* “.”으로 시작되는 항목은 처리하지 않음 */
         continue;
      sprintf(filename, "%s/%s", dir, dirp->d_name);
      if (lstat(filename, &st) == -1) {   /* filename에 대한 정보를 st에 저장 */
         perror("stat failed");
         exit(1);
      }
      /* 파일 형식을 알아내서 정규 파일은 ‘-’를, 디렉토리는 ‘d’를,
         FIFO 파일은 ‘p’를, 그리고 링크는 ‘l’을 list[0]에 저장 */
      switch (st.st_mode & S_IFMT) {
         case S_IFREG :
            list[index++] = '-';
            break;
         case S_IFDIR :
            list[index++] = 'd';
            break;
         case S_IFIFO :
            list[index++] = 'p';
            break;
         case S_IFLNK :
            list[index++] = 'l';
      }
      /* 파일 접근 권한 알아내기 */
      for (i=0; i<3; i++) {
         if (st.st_mode & (S_IREAD >> i*3))
            list[index++] = 'r';
         else
            list[index++] = '-';
         if (st.st_mode & (S_IWRITE >> i*3))
            list[index++] = 'w';
         else
            list[index++] = '-';
         if (st.st_mode & (S_IEXEC >> i*3))
            list[index++] = 'x';
         else
            list[index++] = '-';
      }
      list[index] = '\0';   /* 문자열의 마지막을 의미 */
      /* 링크 수, 파일 소유자 */
      printf("%s%5d %s ", list, st.st_nlink, (getpwuid(st.st_uid))->pw_name);
      /* 파일 그룹 이름, 파일 크기 */
      printf("%s%9d ", (getgrgid(st.st_gid))->gr_name, st.st_size);
      /* 파일 내용 최종 변경 시간 */
      sprintf(buf, "%s", ctime(&st.st_mtime));
      /* 파일에 대한 최종 수정 시간을 ctime(&st.st_mtime)로 출력하면 개행이
        자동적으로 이루어지므로 개행이 일어나지 않도록 ’\n' 위치에 ‘\0’을 넣음 */
      buf[strlen(buf)-1] = '\0';
      printf("%s %s\n", buf, dirp->d_name);   /* 파일 이름 */
   }
   closedir(dp);
   exit(0);
}

사용자 삽입 이미지
      c 언어  |  2007. 9. 14. 10:29



sokoban's Blog is powered by Daum & Tattertools