LINUX进程间通信2.
write(fd[1],buf,30);exit . (0);
default:wait(NULL);read(fd[0],s,30);printf(“%s―,s); } }
例2:父进程生成P1,P2两子进程分别向管道写入各自 的字符,父进程读出它们。
main() { int pid1,pid2,fd[2]; char buf[50],s[50]; pipe(fd); pid1=fork(): switch(pid1){ case –1:perror(”fork failed‖);exit(1); case 0:lockf(fd[1],1,0);//锁定写入端 sprintf(buf,”child p1 is sending messages!\n‖); write(fd[1],buf,50); . sleep(5); lockf(fd[1],0,0);//释放写入端 exit(0); default:pid2=fork();
2.有名管道
注意:无名管道 (1)pipe()的调用必须在fork()之前 (2)及时关闭不需要的句柄 (3)管道通信只能用于父子进程间。
有名管道的创建:
#mknod sampleFIFO 或#mkfifo -m 0666 sampleFIFO
.
例子:
#define FIFO-FILE ―sampleFIFO― void main(void) { FILE *fp; char readbuf[80]; mknod(FIFO-FILE,S_IFIFO|0666,0); while(1){ fp=fopen(FIFO-FILE,‖r‖); #define FIFO-FILE ―sampleFIFO― main(int argc,char *argv[]) { FILE *fp;
1.管道pipe
函数声明:int pipe(int fd[2]); 返回值:0:成功 -1:失败 功能:用系统调用pipe(fd)建立管道文件,读端 fd[0],写端fd[1],管道按照FIFO方式交换信息。 只能用于父子进程间。
pipe( fd)
写 入 端 fd[1]
.
读 出 端 fd[0] read(fd[0],buf,size)
死锁问题ቤተ መጻሕፍቲ ባይዱ
各进程在使用系统资源时应注意死锁问题。 死锁的概念:各并发进程彼此互相等待对方所拥有 的资源,且这些并发进程在得到对方的资源之前不 能继续向前推进的状态
p1
拥 有 S1
.
要
p2
求 S2 要 求 S1
拥 有 S2
s1 死锁的概念
s2
死锁问题
死锁的起因:系统提供的资源个数少于并发进程所要求的该 类资源数。 产生死锁的必要条件: (1)互斥条件 (2)不剥夺条件 (3)部分分配 (4)环路条件 死锁的排除法: (1)死锁的预防 . (2)死锁避免 (3)死锁的检测和恢复
Linux 环 境 下 进 程 控 制 与 通 信
Interprocess Communications(IPC) 进程通信主要有以下几种方法: 1. 管道:无名、有名
2.
3. 4.
信号量
Message queue队列编程; 共享内存编程; TCP/IP socket编程;
.
1. 5.
switch(pid2){ case –1:perror(”fork failed‖);exit(1); case 0:lockf(fd[1],1,0);//锁定写 入端 sprintf(buf,”child p2 is sending messages!\n‖); write(fd[1],buf,50);sleep(5); lockf(fd[1],0,0);//释放写入端 exit(0); default:wait(NULL); read(fd[0],s,50);printf(“%s―, s); wait(NULL);read(fd[0],s,50); printf(“%s―,s);exit(0); } }问题:如果没有lockf(),结果会 怎样?
进程的属性
1.进程标识符:为非负整数,在系统中唯一,进程 0为调度进程,进程1为初始化进程。 Pid=getpid();ppid=getppid() 2.进程组标识符:进程组对于进程间的通信机构—— 信号有用; getpgrp();某个用户退出系统时,系统根据组 标识符来选定该终止的进程。 改变进程组 newgrp=setpgrp ();所建立的新进 . 程将继承 newgrp 。这允许某些进程的生命期超出 用户的注册期。
write(fd[1],buf,size)
例1:父子进程间用管道方式通信。
main() { int pid,fd[2]; char buf[30],s[30]; pipe(fd); pid=fork():
switch(pid){
case –1:perror(”fork failed‖);exit(1); case 0:sprintf(buf,”This is an example\n‖);
进程的属性
3.进程环境 extern char ** environ; main() { char **env=environ; while(*env) printf("%s\n",*env++); } 进程的当前目录:chdir (); . chroot() 进程的资源:
LESSOPEN=|/usr/bin/lesspipe.sh %s HISTSIZE=1000 HOSTNAME= LOGNAME=liuzm REMOTEHOST=162.105.204.163 MAIL=/usr/spool/mail/liuzm TERM=ansi HOSTTYPE=i386 PATH=/usr/local/bin:/bin:/usr/bin:/usr/ X11R6/bin:/home/liuzm/bin:. HOME=/home/liuzm INPUTRC=/etc/inputrc SHELL=/bin/bash USER=liuzm LANG=en_US OSTYPE=Linux SHLVL=1 LS_COLORS= _=./a.out