Linux进程间通信:管道及有名管道(4)

文章作者 100test 发表时间 2007:03:14 16:41:01
来源 100Test.Com百考试题网


1.4管道应用实例:

实例一:用于shell

管道可用于输入输出重定向,它将一个命令的输出直接定向到另一个命令的输入。比如,当在某个shell程序(Bourne shell或C shell等)键入who│wc -l后,相应shell程序将创建who以及wc两个进程和这两个进程间的管道。考虑下面的命令行:

$kill -l 运行结果见附一。

$kill -l | grep SIGRTMIN 运行结果如下:

30) SIGPWR 31) SIGSYS 32) SIGRTMIN 33) SIGRTMIN 1

34) SIGRTMIN 2 35) SIGRTMIN 3 36) SIGRTMIN 4 37) SIGRTMIN 5

38) SIGRTMIN 6 39) SIGRTMIN 7 40) SIGRTMIN 8 41) SIGRTMIN 9

42) SIGRTMIN 10 43) SIGRTMIN 11 44) SIGRTMIN 12 45) SIGRTMIN 13

46) SIGRTMIN 14 47) SIGRTMIN 15 48) SIGRTMAX-15 49) SIGRTMAX-14

实例二:用于具有亲缘关系的进程间通信

下面例子给出了管道的具体应用,父进程通过管道发送一些命令给子进程,子进程解析命令,并根据命令作相应处理。

#include 

#include 

main()

{

int pipe_fd[2].

pid_t pid.

char r_buf[4].

char** w_buf[256].

int childexit=0.

int i.

int cmd.



memset(r_buf,0,sizeof(r_buf)).



if(pipe(pipe_fd)<0)

{

printf("pipe create error\n").

return -1.

}

if((pid=fork())==0)

//子进程:解析从管道中获取的命令,并作相应的处理

{

printf("\n").

close(pipe_fd[1]).

sleep(2).



while(!childexit)

{ 

read(pipe_fd[0],r_buf,4).

cmd=atoi(r_buf).

if(cmd==0)

{

printf("child: receive command from parent over\n now child process exit\n").

childexit=1.

}



else if(handle_cmd(cmd)!=0)

return.

sleep(1).

}

close(pipe_fd[0]).

exit().

}

else if(pid>0)

//parent: send commands to child

{

close(pipe_fd[0]).



w_buf[0]="003".

w_buf[1]="005".

w_buf[2]="777".

w_buf[3]="000".

for(i=0.i<4.i  )

write(pipe_fd[1],w_buf,4).

close(pipe_fd[1]).

} 

}

//下面是子进程的命令处理函数(特定于应用):

int handle_cmd(int cmd)

{

if((cmd<0)||(cmd>256))

//suppose child only support 256 commands

{

printf("child: invalid command \n").

return -1.

}

printf("child: the cmd from parent is %d\n", cmd).

return 0.

}


相关文章


Linux进程间通信:管道及有名管道(1)
Linux进程间通信:管道及有名管道(4)
Linux进程间通信:管道及有名管道(2)
Linux操作系统中常见的桌面环境介绍
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛