进程:运行起来的程序(动态性,并发性,独立性,异步行)
三态:就绪---(调度)---执行---(条件不足)---阻塞---(读数据)读完又成就绪态
程序:静态的
进程互斥:硬件资源或者软件资源不能同时被两个进程同时使用就会产生互斥
临界资源:在进程互斥当中同一时刻只允许一个进程访问的资源
进程的同步:一组并发进程按一定的顺序执行的过程A--B--C
进程调度:按一定算法,从一组待执行的进程中选出一个来占有CPU(抢占式调度和非抢占式调度)
调度算法:先来先服务调度算法,短进程优先调度算法,高级优先级调度算法(不同系统中不同优先级特性),时间片算法(公平调度法)
死锁:多个资源因竞争资源形成一种僵局
获得ID
#include
#include
pid_t getpid(void)//本次进程的ID
pid_t getppid(void)//获取父进程的ID
进程创建-fork();
pid_t fork(void)
fork()被调用一次,返回两次,可能有三个返回值
1,在父进程中,返回新创建的子进程的PID;
2,在子进程中,返回0;
3,如果出现错误,返回一个负值;
#include
#include
int main(void)
{
pid_t pid;
int count=0;//数据空间,堆栈空间全部拷贝,代码段共享
pid=fork();
count++;
printf("count=%d\n",count);
return 0;
}
pid_t vfork();
fork:子进程拷贝父进程的数据段,父子进程的执行次序不确定
vfork:子进程与父进程共享数据段,子进程先运行,父进程后运行
exec函数族
exec不会创建新的进程,用被执行的程序替换它调用的函数
int execl(const char *path,const char*arg1,...)//可执行文件完整路径
execl.c
#include
main()
{
execl("/bin/ls","ls","-al","/etc/passwd",(char *)0);
}
int execlp(const char*path,const char *arg1,...)//可执行文件名
int execv(const char*path,char *const arg[])//把要执行的命令放在argv[]数组里了
int system(const char* string)
#include
void main()
{
system("ls -a /etc/passwd");
}
进程等待
#include
#include
pid_t wait(int *status)
进程间通信原因:
1,数据传输
2,资源共享
3,通知事件
4,进程控制
linux进程发展:UNIX进程间通信--基于System V进程间通信----POSIX(Portable Operating System Interface)进程间通信
linux进程间通信方式
1,pipe无名管道(父子进程之间的通信)和FIFO有名管道(实质是文件)
管道:单项的,先入先出,写(尾部),读(头部)
创建无名管道:int pipe(int filedis[2]);filedis[0]读,filedis[1]写
关闭无名管道:close(pipe_fd[0]),close(pipe_fd[1]);
必须在系统调用fork()前调用pipe(),否则子进程将不会继承文件描述符
//父子进程之间的通信
#include
#include
#include
#include
#include
int main()
{
int pipe_fd[2];
pid_t pid;
char buf_r[100];
char *p_wbuf;
int r_num;
memset(buf_r,0,sizeof(buf_r));
if(pipe(pipe_fd)<0)
{
printf("pipe creat error!\n");
return -1;
}
if(pipe(pipe_fd)==0)
{
printf("\n");
close(pipe_fd[1]);
sleep(2);
if(r_num=read(pipe_fd[0],buf_r,100)>0)
{
printf("%d numbers read from the pipe is %s\n",r_num,buf_r);
}
close(pipe_fd[0]);
exit(0);
}
else if(pid_t>0)
{
close(pipe_fd[0]);
if(write(pipe_fd[1],"hello",5)!=-1)
printf("parent write1 hello!\n");
if(write(pipe_fd[1],"pipe",5)!=-1)
printf("parent write2 pipe!\n");
close(pipe_fd[1]);
sleep(3);
waitpid(pid,NULL,0);
exit(0);
}
}
有名管道
#include
#include
int mkfifo(const char * pathname,mode_t mode)
mode-->O_NONBLOCK:没使用管道没数据进程会阻塞,使用了管道没数据,立刻出错返回
#include
#include
#include
#include
#include
#include
#define FIFO "/tmp/myfifo"
main(int argc,char ** argv)
{
char buf_r[100];
int fd;
int nread;
if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!EEXIST))
printf("cannot creaat fifoserver\n");
printf(preparing for reading bytes...\n);
memset(buf_r,0,sizeof(buf_r));
fd=open(FIFO,O_CREAT|O_NONBLOCK,0);
if(fd==-1)
{
perror("open");
exit(1);
}
while(1)
{
memset(buf_r,0,sizeof(buf_r));
if((nread=read(fd,buf_r,100))==-1)
{
if(errno=EAGAIN)
printf("no data yet\n");
}
printf("read %s from FIFO\n",buf_r);
sleep(1);
}
pause();
}
2,信号signal 发送信号:kill(自己给自己发,也可以给别人发)、raise(只能给自己发) alarm(给自己发信号)SIGALRM pause函数:使进程等待直到收到信号为止 #include typedef void(*sighandler_t)(int)
#include
int main() pause(); 3,共享内存:被多个进程共享的一部分物理内存 #include #define PERM S_IRUSR|S_IWUSR int main(int argc,char **argv) if(argc!=2) } 信号能够传送的西诺西辆有限,管道则只能传送无格式的字节流 打开创建: 发送消息: int msgrcv(int msqid,struct msgbuf *msgp,int msgsz,long msgtype,int msgflg)
struct msg_buf{ int main(void)
int semop(int semid,struct sembuf *sops,unsigned nsops/*指向数组元素的个数*/) struct senbuf{ //6,套接字(socket) |