UNIX进程之间的通信

【UNIX进程之间的通信】
Unix进程之间的通信

进程通讯是unix中很重要的知识 。产生一个新的进程主要有以下3种方法:

1,fork调用;

2,System调用;

3,Exec调用;

我们常说的进程通讯编程主要有以下3种方法:

1,Message queue队列编程;

2,Tcp/IP socket编程;

3,共享内存编程;

一、进程调用

1,产生进程Fork调用例子:

fork()

功能:创建一个新的进程.
语法:#include
#include
pid_t fork();
说明:本系统调用产生一个新的进程, 叫子进程, 是调用进程的一个复制品. 调用进程叫父进程, 子进程继承了父进程的几乎所有的属性:
. 实际UID,GID和有效UID,GID.
. 环境变量.
. 附加GID.
. 调用exec()时的关闭标志.
. UID设置模式比特位.
. GID设置模式比特位.
. 进程组号.
. 会话ID.
. 控制终端.
. 当前工作目录.
. 根目录.
. 文件创建掩码UMASK.
. 文件长度限制ULIMIT.
. 预定值, 如优先级和任何其他的进程预定参数, 根据种类不同决定是否可以继承.
. 还有一些其它属性.


但子进程也有与父进程不同的属性:
. 进程号, 子进程号不同与任何一个活动的进程组号.
. 父进程号.
. 子进程继承父进程的文件描述符或流时, 具有自己的一个拷贝并且与父进程和其它子进程共享该资源.
. 子进程的用户时间和系统时间被初始化为0.
. 子进程的超时时钟设置为0.
. 子进程的信号处理函数指针组置为空.
. 子进程不继承父进程的记录锁.
返回值: 调用成功则对子进程返回0, 对父进程返回子进程号, 这也是最方便的区分父子进程的方法. 若调用失败则返回-1给父进程,子进程不生成.

2,产生进程system调用例子:

功能:产生一个新的进程, 子进程执行指定的命令.
语法:#include
#include
int system(string)
char *string;
说明:本调用将参数string传递给一个命令解释器(一般为sh)执行, 即string被解释为一条命令, 由sh执行该命令.若参数string为一个空指针则为检查命令解释器是否存在.该命令可以同命令行命令相同形式, 但由于命令做为一个参数放在系统调用中, 应注意编译时对特殊意义字符的处理. 命令的查找是按PATH环境变量的定义的. 命令所生成的后果一般不会对父进程造成影响.返回值:当参数为空指针时, 只有当命令解释器有效时返回值为非零.若参数不为空指针, 返回值为该命令的返回状态(同waitpid())的返回值. 命令无效或语法错误则返回非零值,所执行的命令被终止. 其他情况则返回-1.


[code:1:d22bc4f5e9]例子1:char command[81];
int i;
for (i=1;i<8;i) {
sprintf(command,"ps -t ttyi",i);
system(command);
}


例子2:

char befehl[200]; /* string buffer for csh command */
char *runserver = "hosts1"; /* server name */
short shift_act_l; /* currect shift number */
char shift_act_c[1];
char shift_beg[20]; /* shift begin */
char shift_end[20]; /* shift end */
....
T_report_p->shift_no="0";
memcpy(T_report_p->time_from,"yyyy-mm-dd hh:mi:ss",sizeof(T_report_p->time_from));
memcpy(T_report_p->time_to,"yyyy-mm-dd hh:mi:ss",sizeof(T_report_p->time_to));

memset(befehl, "", sizeof(befehl));
sprintf (befehl, "rsh %s %sprot.sh "%s %s %c ".19s" ".19s" "%9.9s" 0" &",
runserver,
REPORT_RSH_PATH,
PROD_LOG,
DRUCKER_NAME_1,
T_report_p->shift_no,
T_report_p->time_from,
T_report_p->time_to,
T_report_p->coil_id );

system (befehl);

3,产生进程exec()调用例子:


exec()

功能:执行一个文件
语法:#include
int execl(path,arg0,...,argn,(char*)0)
char *path,*arg0,...,*argn;

推荐阅读