int execv(path,argv)
char *path,*argv[];
int execle(path,arg0,...,argn,(char*)0,envp)
char *path,*arg0,...,*argn,*envp[];
int execve(path,argv,envp)
char *path,*argv[],*envp[];
int execvp(file,argv)
char *file,*argv[];[/code:1:d22bc4f5e9]
说明:这是一个系统调用族, 用于将一个新的程序调入本进程所占的内存, 并覆盖之, 产生新的内存进程映象. 新的程序可以是可执行文件或SHELL批命令.当C程序被执行时,是如下调用的:
main(int argc,char *argv[],char *envp[]);
argc是参数个数,是各个参数字符串指针数组,envp是新进程的环境变量字符串的指针数组.argc至少为1, argv[0]为程序文件名,所以,在上面的exec系统调用族中,path为新进程文件的路径名,file为新进程文件名,若file不是全路径名,系统调用会按PATH环境变量自动找对应的可执行文件运行.若新进程文件不是一个可执行的目标文件(如批处理文件),则execlp()和execvp()会将该文件内容作为一个命令解释器的标准输入形成system().arg0,...等指针指向""结束的字符串,组成新进程的有效参数,且该参数列表以一个空指针结束.反过来,arg0至少必须存在并指向新进程文件名或路径名.同样,argv是字符串指针数组,argv[0]指向新进程文件名或路径名,并以一空指针结束.envp是一个字符串指针数组,以空指针结束,这些字符串组成新进程的环境.在调用这些系统调用前打开的文件指针对新进程来说也是打开的,除非它已定义了close-on-exec标志.打开的文件指针在新进程中保持不变,所有相关的文件锁也被保留.调用进程设置并正被捕俘的信号在新进程中被恢复为缺省设置,其它的则保持不变.新进程启动时按文件的SUID和SGID设置定义文件的UID和GID为有效UID和GID.新进程还继承了如下属性:
. 附加GID.
. 进程号.
. 父进程号.
. 进程组号.
. 会话号.
. 控制终端.
. alarm时钟信号剩下的时间.
. 当前工作目录.
. 根目录.
. 文件创建掩码.
. 资源限制.
. 用户时间,系统时间,子进程用户时间,子进程系统时间.
. 记录锁.
. 进程信号掩码.
. 信号屏蔽.
. 优先级.
. 预定值.
调用成功后,系统调用修改新进程文件的最新访问时间.返回值:该系统调用一般不会有成功返回值, 因为原来的进程已荡然无存.
例子:printf("now this process will be ps commandn");
execl("/bin/ps","ps","-ef",NULL);
二、进程通讯编程
[code:1:d22bc4f5e9]1,Message queue队列编程例子
/*****************************************************************************
Excerpt from "Linux Programmer"s Guide - Chapter 6"
(C)opyright 1994-1995, Scott Burkett
*****************************************************************************
MODULE: msgtool.c
*****************************************************************************
A command line tool for tinkering with SysV style Message Queues
*****************************************************************************/
#include
#include
#include
#include
#include
#include
#define MAX_SEND_SIZE 80
struct mymsgbuf {
long mtype;
char mtext[MAX_SEND_SIZE];
};
void send_message(int qid, struct mymsgbuf *qbuf, long type, char *text);
void read_message(int qid, struct mymsgbuf *qbuf, long type);
void remove_queue(int qid);
void change_queue_mode(int qid, char *mode);
void usage(void);
int main(int argc, char *argv[])
{
key_t key;
int msgqueue_id;
struct mymsgbuf qbuf;
if(argc == 1)
usage();
/* Create unique key via call to ftok() */
/* key = ftok(".", "w"); */
key = 123456;
printf("key=%dn",key);
key=IPC_PRIVATE;
/* Open the queue - create if necessary */
if((tolower(argv[1][0]))!="s")
{
if((msgqueue_id = msgget(key, IPC_CREAT|0666)) == -1) {
推荐阅读
- 2 SCO UNIX讲座
- 班门弄斧 用机十天之体验
- SCO UNIX系统故障特征、分析及解决
- 在Unix终端上实现多屏功能
- 口令篇 UNIX系统的安全
- super试飞首信V851之一:初步印象篇
- unixware和unix openserver比较二
- Cisco路由器配置信息在Unix下的备份、恢复与更新
- SCO UNIX基础讲座--第十二讲:使用 TCP/IP
- 明日之后中获得钢铁入侵抗击者纪念币具体操作方法