1.进程和程序的区别:进程是程序运行后的活动,程序是静态的(放在磁盘上的,运行起来后叫进程).
2.进程调度中的调度算法:
先来先服务调度算法、短进程优先调度(哪个进程需要的时间短,哪个先来)、高优先级优先调度算法(注意查看该平台下优先级说明,是优先级大先调度还是相反)、时间片轮转法(按照时间片段如1s来循环执行等待的进程)。
3.死锁:多个进程因竞争资源形成僵局(需要外力作用来解决)。
创建进程函数fork和vfork的区别:
1.分别创建子进程后,对于fork,CPU随机执行父进程或者子进程;而对于vfork,CPU则会先执行子进程。
2.fork创建子进程后,子进程拷贝源代码资源,父子资源互不影响。而vfork 父子共享资源。
exec函数族
1、execl
int execlp(const char*path,执行程序所需的参数)
eg:
#include
main()
{
execl("/bin/ls","ls","-al","/etc/passwd",(char*)0);
}
2、execl
eg:
#include
main()
{
execlp("ls","ls","-al","/etc/passwd",(char*)0);
}
两者的差别在于execl中的path要包含完整路径名,而execlp中的参数path不包含路径,直接在path变量中查找。注意要以空指针结束!
3、execv
int execv(const char *path,char*const argv[])
和上述不同点在于用argv[]这一数组来包含执行程序所需要的参数。
eg:
#include
main()
{
char *argv[]={"ls","-al","/etc/passwd",(char*)0};
execv("/bin/ls",argv);
}
优点方便管理,更多参考转载的那篇文章!
4、system函数
#inlcude
int system(const char*string)
功能:调用fork产生子进程,由子进程来调用/bin/sh -c string来执行参数
sting所代表的命令。
eg;
#include
void main()
{
system("ls -al /etc/passwd")
}
注意是在子进程中作用的。
进程等待:
#include
#include
pid_t wait(int*status)
功能:阻塞该进程(父进程,直到某个子进程退出),因为在用fork创建一个新的进程时,父子进程执行顺序是一致的,所以父进程需要等待子进程退出后再退出。
-
#include<sys/types.h>
-
#include<sys/wait.h>
-
#include<unistd.h>
-
#include<stdlib.h>
-
void main()
-
{
-
pid_t pc,pr;
-
pc=fork();
-
if(pc==0) /*if the process is child's*/
-
{
-
printf("this is child process with pid of%d\n",getpid());
-
sleep(3);
-
}
-
else if(pc>0) /*if the process is parent's*/
-
{
-
pr=wait(NULL);
-
printf("i catched a child proccess %d\n",pr);
-
}
-
exit(0);
-
}
最后做了下有等待的fork、无等待fork、以及vfork
阅读(606) | 评论(0) | 转发(0) |