Chinaunix首页 | 论坛 | 博客
  • 博客访问: 187528
  • 博文数量: 54
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2018
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-31 23:14
文章存档

2014年(2)

2013年(52)

分类: 嵌入式

2013-08-26 19:31:04

进程是一个程序的以此执行的过程;

进程是程序执行和资源管理的最小单位。

进程状态:运行态;等待态(可中断,不可中断);停止态(进程被中止);死亡态(但还在进程向量数组中占有一个task_struct结构)。

进程状态中,fork,exit是应用程序调用的接口;其他函数是驱动程序调用的。

进程运行模式分为用户模式和内核模式。
************************************************
进程命令:
    ptree:查看进程树。
    top: 查看系统中的进程。
    getpid();查看进程id,pid是唯一的标示一个进程。
    getppid();查看父进程id
*********************************************
fork:fork函数创建子进程。
        父进程子进程交替竞争执行,完全拷贝父进程的地址空间,资源互不干扰。
点击(此处)折叠或打开
  1. #include <stdio.h>
  2. #include <unistd.h>

  3. int main()
  4. {
  5.     pid_t pid = fork();

  6.     int a = 100;

  7.     if(== pid)
  8.     {
  9.         a = 0;
  10.         while(1)
  11.             printf("aaaaaaaaaaaaaaaaaaaaaa\n");
  12.     }
  13.     else
  14.     if(0 < pid)
  15.     {
  16.         while(1)
  17.             printf("============%d==========\n", a);
  18.     }
  19. }
********************************************
execve系列函数:提供了在程序中启动另外一个程序执行的方法。
                        该函数相当于将fork函数创建的子进程完全占用为自己所用。(当进程认为自己不能再为系统和用户做出任何贡献时,就可以用该函数以执行新函数)
                        由此可以设计一个myshell的程序。(shell捕捉键盘输入---将命令解析------查找路径下的可执行文件)
myshell:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4. #include <pwd.h>
  5. #include <stdlib.h>

  6. void fill_argv(char *buf, char **argv)//完成键盘捕捉,格式:(space)<命令>(space)参数……。
  7. {
  8.     while(*buf)
  9.     {
  10.         if(*buf != ' ' && *(buf-1)==' ')
  11.         {
  12.             *argv++ = buf;
  13.             *(buf-1) = 0;//最后一个元素置为\0.
  14.         }
  15.         buf++;
  16.     }
  17. }

  18. int main()
  19. {
  20.     char buf[100];
  21.     char host_name[100];//存放主机名
  22.     gethostname(host_name, 100);
  23.     pid_t x;
  24.     while(1)
  25.     {
  26.         printf("%s@%s:%s%c ", getpwuid(getuid())->pw_name,//用户名
  27.                     host_name,
  28.                     getcwd(buf, 100),//当前路径
  29.                     getuid()?'$':'#'//是否为超级用户,超级用户返回值为0。
  30.                     );
  31.         fflush(stdout);
  32.         buf[0] = ' ';//第一个做成空格
  33.         gets(buf+1);
  34.         
  35.         if(== strncmp(buf+1, "cd", 2))//cd命令特殊处理,是cd则手动改变目录。
  36.         {
  37.             chdir(buf+4);//改编目录
  38.             continue;
  39.         }    
  40.     
  41.         x = fork();//产生子进程
  42.         if(== 0)
  43.         {
  44.             char *argv[100] = {NULL};
  45.             fill_argv(buf+1, argv);
  46.             execvp(argv[0],argv);//调用execvp,自动搜索可执行文件(命令)路径。
  47.         }
  48.         else
  49.         if(< x)
  50.         {
  51.             wait(NULL);
  52.         }
  53.         else
  54.         {
  55.             perror("fork");
  56.             exit(-1);
  57.         }
  58.     }
  59. }
*********************************************
wait函数:使函数阻塞,直到子进程结束或收到一个信号。
waitpid,类似wait。可以指定等哪一个子进程。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4. #include <sys/wait.h>
  5. #include <stdlib.h>

  6. int main()
  7. {
  8.     pid_t pid = fork();

  9.     if(-== pid)
  10.     {
  11.         perror("fork");
  12.         exit(-1);
  13.     }
  14.     else
  15.     if(== pid)
  16.     {
  17.         sleep(3);
  18.         exit(2);
  19.     }
  20.     else
  21.     {
  22.         int s;
  23.         wait(&s);

  24.         printf("%d\n", WEXITSTATUS(s) );
  25.     }
  26. }
**************************************************
守护进程(后台进程):
创建:
        1,创建子进程,父进程退出
        2,在子进程中创建新会话
        3,改变当前目录为跟目录
        4,重设文件权限掩码
        5,关闭文件描述符

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>

  4. int main()
  5. {
  6.     pid_t pid = fork();
  7.     if(< pid)
  8.     {
  9.         exit(0);
  10.     }
  11.     else
  12.     if(== pid)
  13.     {

  14.         setsid();//创建新会话。并使当前进程成为会话组的组长。

  15.         chdir("/");
  16.         
  17.         umask(0);

  18.         int n = getdtablesize();//关闭用不到的文件
  19.         while(n--)
  20.             close(n);

  21.         while(1)
  22.         {
  23.             
  24.         }
  25.     }
  26.     else
  27.     {
  28.         perror("fork");
  29.         exit(-1);
  30.     }
  31. }













































阅读(1938) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~