strcmp函数
①字符串1小于字符串2,strcmp函数返回一个负值;
②字符串1等于字符串2,strcmp函数返回零;
③字符串1大于字符串2,strcmp函数返回一个正值;那么,字符中的大小是如何比较的呢?来看一个例子。
CMD 打开另一个 Windows 命令解释程序窗口。
main(int argc,char *argv[ ])
argv为指针的指针
argc为整数
char **argv or: char *argv[] or: char argv[][]
main()括号内是固定的写法。
下面给出一个例子来理解这两个参数的用法:
假设程序的名称为prog,
当只输入prog,则由操作系统传来的参数为:
argc=1,表示只有一程序名称。
argc只有一个元素,argv[0]指向输入的程序路径及名称:./prog
当输入prog para_1,有一个参数,则由操作系统传来的参数为:
argc=2,表示除了程序名外还有一个参数。
argv[0]指向输入的程序路径及名称。
argv[1]指向参数para_1字符串。
当输入prog para_1 para_2 有2个参数,则由操作系统传来的参数为:
argc=3,表示除了程序名外还有2个参数。
argv[0]指向输入的程序路径及名称。
argv[1]指向参数para_1字符串。
argv[2]指向参数para_2字符串。
void main( int argc, char *argv[] )
char *argv[] : argv 是一个指针数组,他的元素个数是argc,存放的是指向每一个参数的指针,
他的第一个元素即argv[0]为编译生成的可执行文件名(包括路径 eg:"F:/VC/Ex1/Debug/Ex1.exe"),
从二个元素(argv[1])开始,
是每一个参数 int argc 表示argv的大小,是实际参数个数+1,
其中+1是因为argv[0]是编译后的可执行文件名
main()主函数
每一C 程序都必须有一main()函数, 可以根据自己的爱好把它放在程序的某
个地方。有些程序员把它放在最前面, 而另一些程序员把它放在最后面, 无论放
在哪个地方, 以下几点说明都是适合的。
1. main() 参数
在Turbo C2.0启动过程中, 传递main()函数三个参数: argc, argv和env。
* argc: 整数, 为传给main()的命令行参数个数。
* argv: 字符串数组。
在DOS 3.X 版本中, argv[0] 为程序运行的全路径名; 对DOS 3.0
以下的版本, argv[0]为空串("") 。
argv[1] 为在DOS命令行中执行程序名后的第一个字符串;
argv[2] 为执行程序名后的第二个字符串;
...
argv[argc]为NULL。
*env: 安符串数组。env[] 的每一个元素都包含ENVVAR=value形式的字符
串。其中ENVVAR为环境变量如PATH或87。value 为ENVVAR的对应值如C:/DOS, C:
/TURBOC(对于PATH) 或YES(对于87)。
Turbo C2.0启动时总是把这三个参数传递给main()函数, 可以在用户程序中
说明(或不说明)它们, 如果说明了部分(或全部)参数, 它们就成为main()子程序
的局部变量。
请注意: 一旦想说明这些参数, 则必须按argc, argv, env 的顺序, 如以下
的例子:
main()
main(int argc)
main(int argc, char *argv[])
main(int argc, char *argv[], char *env[])
其中第二种情况是合法的, 但不常见, 因为在程序中很少有只用argc, 而不
用argv[]的情况。
PRGNAME=argv[0]
BAT_STEP1(PRGNAME) //批处理前处理
.
.
.
BAT_STEP2(PRGNAME) //批处理后处理 (作用是?????)
消息队列函数(msgget、msgctl、msgsnd、msgrcv)及其范例
消息队列函数由msgget、msgctl、msgsnd、msgrcv四个函数组成。下面的表格列出了这四个函数的函数原型及其具体说明。
1. msgget函数原型
msgget(得到消息队列标识符或创建一个消息队列对象) | ||
所需头文件 | #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> | |
函数说明 | 得到消息队列标识符或创建一个消息队列对象并返回消息队列标识符 | |
函数原型 | int msgget(key_t key, int msgflg) | |
函数传入值 | key | 0(IPC_PRIVATE):会建立新的消息队列 |
大于0的32位整数:视参数msgflg来确定操作。通常要求此值来源于ftok返回的IPC键值 | ||
msgflg | 0:取消息队列标识符,若不存在则函数会报错 | |
IPC_CREAT:当msgflg&IPC_CREAT为真时,如果内核中不存在键值与key相等的消息队列,则新建一个消息队列;如果存在这样的消息队列,返回此消息队列的标识符 | ||
IPC_CREAT|IPC_EXCL:如果内核中不存在键值与key相等的消息队列,则新建一个消息队列;如果存在这样的消息队列则报错 | ||
函数返回值 | 成功:返回消息队列的标识符 | |
出错:-1,错误原因存于error中 | ||
附加说明 | 上述msgflg参数为模式标志参数,使用时需要与IPC对象存取权限(如0600)进行|运算来确定消息队列的存取权限 | |
错误代码 | EACCES:指定的消息队列已存在,但调用进程没有权限访问它 EEXIST:key指定的消息队列已存在,而msgflg中同时指定IPC_CREAT和IPC_EXCL标志 ENOENT:key指定的消息队列不存在同时msgflg中没有指定IPC_CREAT标志 ENOMEM:需要建立消息队列,但内存不足 ENOSPC:需要建立消息队列,但已达到系统的限制 |
如果用msgget创建了一个新的消息队列对象时,则msqid_ds结构成员变量的值设置如下:
Ÿ msg_qnum、msg_lspid、msg_lrpid、 msg_stime、msg_rtime设置为0。
Ÿ msg_ctime设置为当前时间。
Ÿ msg_qbytes设成系统的限制值。
Ÿ msgflg的读写权限写入msg_perm.mode中。
Ÿ msg_perm结构的uid和cuid成员被设置成当前进程的有效用户ID,gid和cuid成员被设置成当前进程的有效组ID。
2. msgctl函数原型
msgctl (获取和设置消息队列的属性) | ||
所需头文件 | #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> | |
函数说明 | 获取和设置消息队列的属性 | |
函数原型 | int msgctl(int msqid, int cmd, struct msqid_ds *buf) | |
函数传入值 | msqid | 消息队列标识符 |
cmd
| IPC_STAT:获得msgid的消息队列头数据到buf中 | |
IPC_SET:设置消息队列的属性,要设置的属性需先存储在buf中,可设置的属性包括:msg_perm.uid、msg_perm.gid、msg_perm.mode以及msg_qbytes | ||
buf:消息队列管理结构体,请参见消息队列内核结构说明部分 | ||
函数返回值 | 成功:0 | |
出错:-1,错误原因存于error中 | ||
错误代码 | EACCESS:参数cmd为IPC_STAT,确无权限读取该消息队列 EFAULT:参数buf指向无效的内存地址 EIDRM:标识符为msqid的消息队列已被删除 EINVAL:无效的参数cmd或msqid EPERM:参数cmd为IPC_SET或IPC_RMID,却无足够的权限执行 |
3. msgsnd函数原型
msgsnd (将消息写入到消息队列) | ||
所需头文件 | #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> | |
函数说明 | 将msgp消息写入到标识符为msqid的消息队列 | |
函数原型 | int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg) | |
函数传入值 | msqid | 消息队列标识符 |
msgp | 发送给队列的消息。msgp可以是任何类型的结构体,但第一个字段必须为long类型,即表明此发送消息的类型,msgrcv根据此接收消息。msgp定义的参照格式如下: struct s_msg{ /*msgp定义的参照格式*/ | |
msgsz | 要发送消息的大小,不含消息类型占用的4个字节,即mtext的长度 | |
msgflg | 0:当消息队列满时,msgsnd将会阻塞,直到消息能写进消息队列 | |
IPC_NOWAIT:当消息队列已满的时候,msgsnd函数不等待立即返回 | ||
IPC_NOERROR:若发送的消息大于size字节,则把该消息截断,截断部分将被丢弃,且不通知发送进程。 | ||
函数返回值 | 成功:0 | |
出错:-1,错误原因存于error中 | ||
错误代码 | EAGAIN:参数msgflg设为IPC_NOWAIT,而消息队列已满 EIDRM:标识符为msqid的消息队列已被删除 EACCESS:无权限写入消息队列 EFAULT:参数msgp指向无效的内存地址 EINTR:队列已满而处于等待情况下被信号中断 EINVAL:无效的参数msqid、msgsz或参数消息类型type小于0 |
msgsnd()为阻塞函数,当消息队列容量满或消息个数满会阻塞。消息队列已被删除,则返回EIDRM错误;被信号中断返回E_INTR错误。
如果设置IPC_NOWAIT消息队列满或个数满时会返回-1,并且置EAGAIN错误。
msgsnd()解除阻塞的条件有以下三个条件:
① 不满足消息队列满或个数满两个条件,即消息队列中有容纳该消息的空间。
② msqid代表的消息队列被删除。
③ 调用msgsnd函数的进程被信号中断。
4. msgrcv函数原型
msgrcv (从消息队列读取消息) | ||
所需头文件 | #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> | |
函数说明 | 从标识符为msqid的消息队列读取消息并存于msgp中,读取后把此消息从消息队列中删除 | |
函数原型 | ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); | |
函数传入值 | msqid | 消息队列标识符 |
msgp | 存放消息的结构体,结构体类型要与msgsnd函数发送的类型相同 | |
msgsz | 要接收消息的大小,不含消息类型占用的4个字节 | |
msgtyp | 0:接收第一个消息 | |
>0:接收类型等于msgtyp的第一个消息 | ||
<0:接收类型等于或者小于msgtyp绝对值的第一个消息 | ||
msgflg | 0: 阻塞式接收消息,没有该类型的消息msgrcv函数一直阻塞等待 | |
IPC_NOWAIT:如果没有返回条件的消息调用立即返回,此时错误码为ENOMSG | ||
IPC_EXCEPT:与msgtype配合使用返回队列中第一个类型不为msgtype的消息 | ||
IPC_NOERROR:如果队列中满足条件的消息内容大于所请求的size字节,则把该消息截断,截断部分将被丢弃 | ||
函数返回值 | 成功:实际读取到的消息数据长度 | |
出错:-1,错误原因存于error中 | ||
错误代码 | E2BIG:消息数据长度大于msgsz而msgflag没有设置IPC_NOERROR EIDRM:标识符为msqid的消息队列已被删除 EACCESS:无权限读取该消息队列 EFAULT:参数msgp指向无效的内存地址 ENOMSG:参数msgflg设为IPC_NOWAIT,而消息队列中无消息可读 EINTR:等待读取队列内的消息情况下被信号中断 |
msgrcv()解除阻塞的条件有以下三个:
① 消息队列中有了满足条件的消息。
② msqid代表的消息队列被删除。
③ 调用msgrcv()的进程被信号中断。
例子:http://blog.csdn.net/guoping16/article/details/6584024