进程是一个程序的以此执行的过程;
进程是程序执行和资源管理的最小单位。
进程状态:运行态;等待态(可中断,不可中断);停止态(进程被中止);死亡态(但还在进程向量数组中占有一个task_struct结构)。
进程状态中,fork,exit是应用程序调用的接口;其他函数是驱动程序调用的。
进程运行模式分为用户模式和内核模式。
************************************************
进程命令:
ptree:查看进程树。
top: 查看系统中的进程。
getpid();查看进程id,pid是唯一的标示一个进程。
getppid();查看父进程id
*********************************************
fork:fork函数创建子进程。
父进程子进程交替竞争执行,完全拷贝父进程的地址空间,资源互不干扰。
点击(此处)折叠或打开
-
#include <stdio.h>
-
#include <unistd.h>
-
-
int main()
-
{
-
pid_t pid = fork();
-
-
int a = 100;
-
-
if(0 == pid)
-
{
-
a = 0;
-
while(1)
-
printf("aaaaaaaaaaaaaaaaaaaaaa\n");
-
}
-
else
-
if(0 < pid)
-
{
-
while(1)
-
printf("============%d==========\n", a);
-
}
-
}
********************************************
execve系列函数:提供了在程序中启动另外一个程序执行的方法。
该函数相当于将fork函数创建的子进程完全占用为自己所用。(当进程认为自己不能再为系统和用户做出任何贡献时,就可以用该函数以执行新函数)
由此可以设计一个myshell的程序。(shell捕捉键盘输入---将命令解析------查找路径下的可执行文件)
myshell:
-
#include <stdio.h>
-
#include <unistd.h>
-
#include <sys/types.h>
-
#include <pwd.h>
-
#include <stdlib.h>
-
-
void fill_argv(char *buf, char **argv)//完成键盘捕捉,格式:(space)<命令>(space)参数……。
-
{
-
while(*buf)
-
{
-
if(*buf != ' ' && *(buf-1)==' ')
-
{
-
*argv++ = buf;
-
*(buf-1) = 0;//最后一个元素置为\0.
-
}
-
buf++;
-
}
-
}
-
-
int main()
-
{
-
char buf[100];
-
char host_name[100];//存放主机名
-
gethostname(host_name, 100);
-
pid_t x;
-
while(1)
-
{
-
printf("%s@%s:%s%c ", getpwuid(getuid())->pw_name,//用户名
-
host_name,
-
getcwd(buf, 100),//当前路径
-
getuid()?'$':'#'//是否为超级用户,超级用户返回值为0。
-
);
-
fflush(stdout);
-
buf[0] = ' ';//第一个做成空格
-
gets(buf+1);
-
-
if(0 == strncmp(buf+1, "cd", 2))//cd命令特殊处理,是cd则手动改变目录。
-
{
-
chdir(buf+4);//改编目录
-
continue;
-
}
-
-
x = fork();//产生子进程
-
if(x == 0)
-
{
-
char *argv[100] = {NULL};
-
fill_argv(buf+1, argv);
-
execvp(argv[0],argv);//调用execvp,自动搜索可执行文件(命令)路径。
-
}
-
else
-
if(0 < x)
-
{
-
wait(NULL);
-
}
-
else
-
{
-
perror("fork");
-
exit(-1);
-
}
-
}
-
}
*********************************************
wait函数:使函数阻塞,直到子进程结束或收到一个信号。
waitpid,类似wait。可以指定等哪一个子进程。
-
#include <stdio.h>
-
#include <unistd.h>
-
#include <sys/types.h>
-
#include <sys/wait.h>
-
#include <stdlib.h>
-
-
int main()
-
{
-
pid_t pid = fork();
-
-
if(-1 == pid)
-
{
-
perror("fork");
-
exit(-1);
-
}
-
else
-
if(0 == pid)
-
{
-
sleep(3);
-
exit(2);
-
}
-
else
-
{
-
int s;
-
wait(&s);
-
-
printf("%d\n", WEXITSTATUS(s) );
-
}
-
}
**************************************************
守护进程(后台进程):
创建:
1,创建子进程,父进程退出
2,在子进程中创建新会话
3,改变当前目录为跟目录
4,重设文件权限掩码
5,关闭文件描述符
-
#include <stdio.h>
-
#include <unistd.h>
-
#include <stdlib.h>
-
-
int main()
-
{
-
pid_t pid = fork();
-
if(0 < pid)
-
{
-
exit(0);
-
}
-
else
-
if(0 == pid)
-
{
-
-
setsid();//创建新会话。并使当前进程成为会话组的组长。
-
-
chdir("/");
-
-
umask(0);
-
-
int n = getdtablesize();//关闭用不到的文件
-
while(n--)
-
close(n);
-
-
while(1)
-
{
-
-
}
-
}
-
else
-
{
-
perror("fork");
-
exit(-1);
-
}
-
}
阅读(1938) | 评论(0) | 转发(0) |