- 在使用c++进行编程时,有时需要对文件进行操作,利用命令行参数对文件进行操作就比较方便;
int main(int argc,char* argv[]){ }
中传入的参数都是形式参数;- argc和argv参数在使用命令行执行程序时候使用,这样我们就能传入参数;
- int main(int argc, char** argv)主函数中的argc代表的是参数的数量,至少为1(argv[0]即.exe文件的路径)。
- argv为指针表示的参数,argv[0]表示第一个参数,argv[1]表示第二个参数,以此类推。
- 命令行参数在程序开始运行的时候传递给程序。
- 命令行参数作用大致有三方面:
确定信息的来源(比如输入文件的地址)
确定信息的终点 (比如输出的地址)
切换程序的执行
//mmap_w.c
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <string.h>
struct student { //定义的结构体
int id;
char name[256];
char age;
};
void sys_err(const char *str)
{
perror(str);
exit(1);
}
int main(int argc, char *argv[])
{
struct student stu = {1, "xiaoming", 18};
struct student *p;
int fd; //文件描述符
//读写权限 打开/创建文件
fd = open("test_map" , O_RDWR|O_CREAT|O_TRUNC , 0664);
if (fd == -1)
sys_err("open error");
//创建一个 结构体大小的 内存映射区
ftruncate(fd, sizeof(stu));
p = mmap(NULL, sizeof(stu), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
if (p == MAP_FAILED)
sys_err("mmap error");
close(fd);
while (1) {
memcpy(p, &stup, sizeof(stu));
stu.id++;
sleep(1);
}
munmap(p, sizeof(stup));
return 0;
}
//mmap_r.c
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <string.h>
struct student { //定义的结构体
int id;
char name[256];
char age;
};
void sys_err(const char *str)
{
perror(str);
exit(1);
}
int main(int argc, char *argv[])
{
struct student stu;
struct student *p;
int fd; //文件描述符
fd = open("test_map" , O_RDWR);
if (fd == -1)
sys_err("open error");
p = mmap(NULL, sizeof(stu), PROT_READ, MAP_SHARED, fd, 0);
if (p == MAP_FAILED)
sys_err("mmap error");
close(fd);
while (1) {
printf("id = %d, name = %s; age = %d\n" p->id, p->name, p->age);
sleep(1);
}
munmap(p, sizeof(stup));
return 0;
}
- 1)mmap的数据可以重复读取,而pipe,fifo只能读取一次。
- 2)mmap能在无血缘的进程间通信根本原因是因为有共同的映射区。pipe,fifo因为有共同的管道。当然有血缘关系的mmap和匹配,fifo也可以这样解释。