Linux 上实现双向进程间通信管道(转)
问题和常见方法
Linux 提供了 popen 和 pclose 函数 (1),用于创建和关闭管道与另外一个进程进行通信。其接口如下:
FILE *popen(const char *command, const char *mode);
int pclose(FILE *stream);
遗憾的是,popen 创建的管道只能是单向的 -- mode 只能是 "r" 或 "w" 而不能是某种组合--用户只能选择要么往里写,要么从中读,而不能同时在一个管道中进行读写。实际应用中,经常会有同时进行读写的要求,比如,我们可能希望把文本数据送往sort工具排序后再取回结果。此时popen就无法用上了。我们需要寻找其它的解决方案。
有一种解决方案是使用 pipe 函数 (2)创建两个单向管道。没有错误检测的代码示意如下:
int pipe_in[2], pipe_out[2];
pid_t pid;
pipe(&pipe_in); // 创建父进程中用于读取数据的管道
pipe(&pipe_out); // 创建父进程中用于写入数据的管道
if ( (pid = fork()) == 0) { // 子进程
close(pipe_in[0]); // 关闭父进程的读管道的子进程读端
close(pipe_out[1]); // 关闭父进程的写管道的子进程写端
dup2(pipe_in[1], STDOUT_FILENO); // 复制父进程的读管道到子进程的标准输出
dup2(pipe_out[0], STDIN_FILENO); // 复制父进程的写管道到子进程的标准输入
close(pipe_in[1]); // 关闭已复制的读管道
close(pipe_out[0]); // 关闭已复制的写管道
/* 使用exec执行命令 */
} else { // 父进程
close(pipe_in[1]); // 关闭读管道的写端
close(pipe_out[0]); // 关闭写管道的读端
/* 现在可向pipe_out[1]中写数据,并从pipe_in[0]中读结果 */
close(pipe_out[1]); // 关闭写管道
/* 读取pipe_in[0]中的剩余数据 */
close(pipe_in[0]); // 关闭读管道
/* 使用wait系列函数等待子进程退出并取得退出代码 */
}
当然,这样的代码的可读性(特别是加上错误处理代码之后)比较差,也不容易封装成类似于popen/pclose的函数,方便高层代码使用。究其原因,是pipe函数返回的一对文件描述符只能从第一个中读、第二个中写(至少对于Linux是如此)。为了同时读写,就只能采取这么累赘的两个pipe调用、两个文件描述符的形式了。
回页首
一个更好的方案
使用pipe就只能如此了。不过,Linux实现了一个源自BSD的socketpair调用 (3),可以实现上述在同一个文件描述符中进行读写的功能(该调用目前也是POSIX规范的一部分 (4))。该系统调用能创建一对
相关文档:
例一:发送Signaling Packet:
Signaling Command是2个Bluetooth实体之间的L2CAP层命令传输。所以得Signaling Command使用CID 0x0001.
多个Command可以在一个C-frame(control frame)中发送。
如果要直接发送Signaling Command.需要建立SOCK_RAW类型的L2CAP连接Socket。这样才有机会自己填充Command Code,Identi ......
[编辑中]
-m32
# ld -V
GNU ld version 2.15.92.0.2 20040927
Supported emulations:
elf_x86_64
elf_i386
i386linux
#ld -m elf_i386
Along with the -m32 flag in gcc, you may need to include the -melf_i386 flag for ld to properly link the 32bi ......
时区设定:
主要文件
/etc/sysconfig/clock
用北京时间的正确内容应该是
TIMEZONE="Asia/Beijing"
DEFAULT_TIMEZONE="Asia/Beijing"
同时确保 /etc/localtime文件是/usr/share/zoneinfo/Asia/Beijing的拷贝
保持更新:
在/etc/crontab中加入一行
10 5 * * * root /usr/sbin/ntpdate 221.139.48.11 && /sbin/ ......
另:要实现某一些linux自带命令相同的功能,(比如:要实现在linux下查询cpu的占用率,linux的命令是top), 可以参考一下该命令(top)的linux源码,
转自http://hi.baidu.com/yanjinbin/blog/item/3d25ebdd29756fea76c6381f.html
# which reboot <---which指令会在环境变量$PATH设置的目录里查找符合条件的 ......
在linux的proc文件系统中,通过查看/proc/net/dev文件
可以得到每个网络接口的吞吐量,但是无法获得实时带宽
最近发现了一种基于ncurses库的小程序bmon,可以获得实时带宽
Example:
执行
[root@debian ~]# bmon -o ascii -p eth0
Interface RX Rate RX # TX Rate TX #
eth0 0.00B 0.0 0.00B 0.0
eth0 0.00B 0.0 ......