linux系统调用函数---12
Linux应用编程学习笔记
周学伟
一.系统调用文件编程
1.文件打开函数
/*****************************************************************************
函数名:open
函数原型:int open(const char * pathname, int flags)
int open(const char * pathname,int flags,mode_t mode)
函数功能:打开或创建一个文件
所属头文件:<sys/types.h> <sys/stat.h> <fcntl.h>
返回值:成功时:返回的是文件描述符
失败时:返回-1
参数说明:pathname:打开文件的路径与文件名
Flags:打开方式
O_RDONLY:只读方式打开
O_WRONLY:只写方式打开
O_RDWE:读写模式
还有附加选项,选项通过”|”与上面链接
O_APPEND:每次写操作都写入文件的尾部
O_CREAT:如果指定文件不存在,则创建这个文件
Mode:前提是前面使用O_CREAT参数,创建这个文件并且以mode模式打开
****************************************************************************/
2.创建文件
/*****************************************************************************
函数名:creat
函数原型:int creat(const char * pathname,mode_t mode)
函数功能:创建一个文见并以只写的方式打开该文件
所属头文件:<sys/types.h> <sys/stat.h> <fcntl.h>
返回值:成功时:返回的是文件描述符
失败时:返回-1
参数说明:pathname:创建的文件的路径与文件名
Flags:创建文件读写权限
O_RDONLY:只读方式打开
O_WRONLY:只写方式打开
O_RDWE:读写模式
还有附加选项,选项通过”|”与上面链接
O_APPEND:每次写操作都写入文件的尾部
O_CREAT:如果指定文件不存在,则创建这个文件
Mode:前提是前面使用O_CREAT参数,创建这个文件并且以mode模式打开
****************************************************************************/
3.关闭文件
/*****************************************************************************
函数名:close
函数原型:int close(int fd)
函数功能:创建一个文件并以只写的方式打开该文件
所属头文件: <unistd.h>
返回值:成功时:返回0
失败时:返回-1
参数说明:fd:关闭文件的文件描述符
****************************************************************************/
4.读文件
/*****************************************************************************
函数名: read
函数原型:ssize_t read(int fd,void *buf,size_t count)
函数功能:读文件
所属头文件: <unistd.h>
返回值:成功时:返回读取的字节数
失败时:返回-1
参数说明:fd:要进行读操作的文件的文件描述符
buf:存储从fd所指向的文件中读取的数据
count:希望读取的字节数
****************************************************************************/
4.写文件
/*****************************************************************************
函数名:write
函数原型:ssize_t write(int fd,const void *buf,size_t ledgth)
函数功能:想指定文件写入数据
所属头文件: <unistd.h>
返回值:成功时:返回写入到文件中的的字节数
失败时:返回-1
参数说明:fd:要进行读操作的文件的文件描述符
buf:要写入数据的存放区
ledgth:希望写入的字节数
****************************************************************************/
5.文件定位
/*****************************************************************************
函数名:lseek
函数原型:off_t lseek(int fd,0ff_t offset int whence)
函数功能:重新定位文件的读写位置
所属头文件: <sys/types.h> <unistd.h>
返回值:成功时:返回移动后的文件指针距离文件头的位置
失败时:返回-1
参数说明:fd:要进行操作的文件的文件描述符
Offset:从whence所指的位置开始向前或向后移动Offset个偏移量
whence:文件指针起始位置。取值如下:
SEEK_SET:文件指针起始位置在文件头部
SEEK_CUR:文件指针起始位置在文件当前位置
SEEK_END:文件指针起始位置在文件尾部
****************************************************************************/
6.复制文件的描述符
/*****************************************************************************
函数名:dup
函数原型:int dup(int oldfd)
函数功能:复制文件描述符
所属头文件: <unistd.h>
返回值:成功时:返回新的文件描述符
失败时:返回-1
参数说明:oldfd:待复制的老的文件描述符
****************************************************************************/
文件说明:文件拷贝函数
创建日期:2014.11.25
创建者:周学伟
函数说明:./text start.S cpdfile
-----------------------------------------------------------------------------------------------------------------
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
void main(int argc, char ** argv)
{
int fd_s,fd_d;
char buf[512];
int count = 0;
/***打开源文件***/
fd_s = open(argv[1],O_RDONLY);
/***打开或创建目标文件***/
fd_d = open(argv[2],O_RDWR|O_CREAT,0666);
/***循环读取所有内容***/
while((count = read(fd_s,buf,512))>0)
{
write(fd_d,buf,count);
}
close(fd_s);
close(fd_d);
}
二.库函数访问文件编程
1.打开文件
/*****************************************************************************
函数名:fopen
函数原型:FILE * fopen(const char * path,const char * mode)
函数功能:打开文件
所属头文件: <stdio.h>
返回值:成功时:返回文件的指针
失败时:返回空指针NULL
参数说明:path:文件的名字,包含路径
Mode:打开方式,参数如下:
“r”:以只读方式打开文件
“r+”:以可读可写方式打开文件
“w”:以只写方式打开文件,若文件不存在则创建该文件
“w+”::以可读可写方式打开文件,若文件不存在则创建该文件否则 文件会被清空
“a”:以追加方式打开只写文件,若文件不存在则创建该文件,若文件
存在写入的数据会追加到文件尾部。原先文件内容会被保存
“a”:以追加方式打开可读可写文件,若文件不存在则创建该文件,
****************************************************************************/
2.关闭文件
/*****************************************************************************
函数名:fclose
函数原型:int fclose(FILE *fp )
函数功能:关闭打开的文件
所属头文件: <stdio.h>
返回值:成功时:返回0
失败时:返回EOF
参数说明:fp:关闭fp指向指向的文件的指针
****************************************************************************/
3.读文件
/*****************************************************************************
函数名:fread
函数原型:size_t fread(void *ptr.size _t size,size_t named,FILE * stream)
函数功能:从文件中读取数据
所属头文件: <stdio.h>
返回值:成功时:返回成功读取到的数据量
失败时:返回0
参数说明:stream:指向要读取数据的文件
Ptr:指向读取到的数据存放的位置
Size:每块数据中每次读取的数据大小Size
Named:读取Named块数据
****************************************************************************/
4.写文件
/*****************************************************************************
函数名:fwrite
函数原型:size_t fwrite (const void *buffer .size _t size,size_t named,FILE * stream)
函数功能:向文件中写入数据
所属头文件: <stdio.h>
返回值:成功时:返回成功写入到的数据量
失败时:返回0
参数说明:stream:指向要写入数据的文件
buffer:存放要写入文件的数据
Size:每块数据中每次写入的数据大小Size
Named:写入Named块数据
****************************************************************************/
5.定位文件
/*****************************************************************************
函数名:fseek
函数原型:size_t fseek (FILE * stream,long offset,int origin)
函数功能:重新定位文件的读写位置
所属头文件: <stdio.h>
返回值:成功时:返回0
失败时:返回-1
参数说明:stream:指向要写入数据的文件
Offset:偏移量,正数表示正向移动,复数表示负向移动
Origin:文件指针起始位置。取值如下:
SEEK_SET:文件指针起始位置在文件头部
SEEK_CUR:文件指针起始位置在文件当前位置
SEEK_END:文件指针起始位置在文件尾部
(可用数字一次表示为:0, 1, 2)
****************************************************************************/
三.时间编程
4.获取日历时间
/*****************************************************************************
函数名:time
函数原型:time_t time (time_t * time)
函数功能:获取当前的系统时间
所属头文件: <time.h>
返回值:成功时:返回日历时间(秒数)
失败时:返回-1
参数说明:time:不为空的情况下,保存从1970.1.1.0点0分0秒到现在的秒数
****************************************************************************/
5.获取格林威治时间
/*****************************************************************************
函数名:gmtime
函数原型:struct tm *gmtime (const time_t *clock)
函数功能:通过日历时间转化成格林威治时间(世界标准时间)
所属头文件: <time.h>
返回值:成功时:返回世界标准时间,以struct tm 结构返回
失败时:返回NULL
参数说明:clock:待转化的时间
****************************************************************************/
6.获取本地时间
/*****************************************************************************
函数名:localtime
函数原型:struct tm *localtime (const time_t *clock)
函数功能:获取本地时间
所属头文件: <time.h>
返回值:成功时:返回本地时间,返回值以struct tm结构返回
失败时:返回NULL
参数说明:clock:指向待转化的日历时间的指针变量
****************************************************************************/
7.以字符串格式本地时间
/*****************************************************************************
函数名:asctime
函数原型:char *ascltime (const struvt tmt *clock)
函数功能:把tm格式存放的时间转化为字符串格式
所属头文件: <time.h>
返回值:成功时:返回字符串格式的时间
失败时:返回NULL
参数说明:clock:待转化的tm格式的时间
****************************************************************************/
8获取高精度的时间
/*****************************************************************************
函数名:gettimeofday
函数原型:int gettimeofday(struct timeval *tv, struct timezone *tz)
函数功能:获取到本地高精度的时间
所属头文件:<sys/time.h>
返回值:成功时:返回0
失败时:返回-1
参数说明:tv:指向包含秒和微妙的结构(从1970.1.1.0点0分0秒到现在)
tz:通常为空NULL
****************************************************************************/
四.进程控制理论
1.获取进程的PID
/*****************************************************************************
函数名:getpid
函数原型:pid_t getpid(void)
函数功能:获取调用getpid的进程的PID
所属头文件:<unistd.h> <sys/types.h>
返回值:成功时:返回调用进程的ID
参数说明:无
****************************************************************************/
2.创建一个子进程
/*****************************************************************************
函数名:fork
函数原型:pid_t fork(void)
特殊说明:1.运行次序不一定
2.子进程拥有自己独立的栈区
3.子进程只能用exit()函数退出,父进程可用exit()函数也可用return退出
函数功能:创建一个子进程
所属头文件:<unistd.h>
返回值:成功时:子进程中:返回0
父进程中:返回子进程的ID
失败时:返回-1
参数说明:无
****************************************************************************/
3.创建一个子进程
/*****************************************************************************
函数名:vfork
函数原型:pid_t vfork(void)
特殊说明:1.一定是子进程先运行。
2.子进程和父进程共享同一片栈区
3.子进程只能用exit()函数退出,父进程可用exit()函数也可用return退出
函数功能:创建一个子进程,并阻塞父进程,
所属头文件:<unistd.h> <sys/types.h>
返回值:成功时:子进程中:返回0
父进程中:返回子进程的ID
失败时:返回-1
参数说明:无
****************************************************************************/
4.进程等待
/*****************************************************************************
函数名:wait
函数原型:pid_t wait(int *status)
函数功能:挂起调用它的子进程,知道其子进程结束
所属头文件:<sys/types.h> <sys/wait.h>
返回值:成功时:返回终止的那个子进程的ID
失败时:返回-1
参数说明:status:记录子进程退出的原因
****************************************************************************/
5.运行程序
/*****************************************************************************
函数名:execl
函数原型:int execl(const char *path,const char *arg........)
函数功能:运行可执行的程序
所属头文件:<unistd.h>
返回值:成功时:不返回
失败时:返回-1
参数说明:path:表示要运行的可执行文件路径
Arg:可执行文件运行所需的参数,以空指针NULL结束
调用例程:execl(“/bin/ls”,”ls”,”/home”,NULL);
特殊说明:如果调用execl函数整个程序的代码段全部变成ls下面的代码了。
在原来的进程中,用新的代码段替换原有的程序,执行新的程序。
****************************************************************************/
6.运行程序
/*****************************************************************************
函数名:system
函数原型:int system(const char *command)
函数功能:运行可执行的程序
所属头文件:<unistd.h>
返回值:成功时:返回一个状态值
失败时:返回-1
参数说明:command:被执行的命令,字符串格式
调用例程:execl(“/bin/ls”,”ls”,”/home”,NULL);
特殊说明:如果调用execl函数整个程序的代码段全部变成ls下面的代码了。
在原来的进程中,先执行system中的命令,在执行其后的数据。
新的代码段不会替换原有的程序。
****************************************************************************/
五.进程间的通信
/*****************************************************************************
1通信方式:A.无名管道和有名管道(数据传输)
B.信号(时间通知)
C.信号量(资源共享)
D.消息队列
E.共享内存
F.套接字
2.特殊说明:A.无名管道只能用于子进程和父进程间通信。
B.有名管道可用于任意两个进程之间通信。
C.管道通信是单向的,有固定的读端和写端
D.取走数据后,管道为空。
E.若管道为空,读取时读进程阻塞,直到有数据可读。
****************************************************************************/
1.无名管道编程
/*****************************************************************************
函数名:pipe
函数原型:int pipe(int fd[2])
函数功能:创建一个无名管道
所属头文件:<unistd.h>
返回值:成功时:返回0
失败时:返回-1
参数说明:fd[0]:指向读端
fd[1]:指向写端
特殊说明:可以使用write(),read(),close()等函数操作数据
****************************************************************************/
2.有名管道编程
1,创建有名管道
/*****************************************************************************
函数名:mkfifo
函数原型:int mkfifo(const char *pathname,mode_t mode)
函数功能:创建一个无名管道
所属头文件:<sys/types.h> <sys/stat.h>
返回值:成功时:返回0
失败时:返回-1,错误原因存放于errno
参数说明:pathname:创建有名管道对应的实名文件路径。该文件必须不存在
mode:文件的权限
特殊说明:可以使用write(),read(),close()等函数操作数据。
读FIFO文件的进程只能以RDONLY权限读取。
写FIFO文件的进程只能以WRONLY权限写入数据。
读完FIFO文件后,文件内容为空。
****************************************************************************/
例程分析:
#include <stdio.h> <sys/wait.h> <unistd.h> <sys/types.h>
void main()
{
int pipefd[2]; pid_t pid1=0; char buffer[10];
pipe(pipefd);
pid1 = fork();
if(pid1>0)
{
write(pipefd[1],"zhou",5);
wait(NULL); close(pipefd[1]); exit(0);
}
if(pid1==0)
{
read(pipefd[0],buffer,5);
close(pipefd[0]); printf("read is data: %s\n",buffer); exit(0);
}
}
---------------------------------------------------------------------------------------------------------------------
1,删除有名管道
/*****************************************************************************
函数名:unlink
函数原型:int unlink(const char *pathname)
函数功能:删除有名管道(有名管道的实质是一个特殊文件)
所属头文件:<unistd.h>
返回值:成功时:返回0
失败时:返回-1,错误原因存放于errno
参数说明:pathname:创建有名管道对应的实名文件路径名。
****************************************************************************/
例程分析:
/***********************************写进程代码*******************************/
#include <sys/types.h> <sys/stat.h> <unistd.h> <fcntl.h>
void main()
{
int fd=0;
mkfifo("/home/fifo",0666);
fd = open("/home/fifo",O_WRONLY);
write(fd,"zhouxue",8);
close(fd);
}
/*****************************读进程代码********************************/
#include <sys/types.h> <sys/stat.h> <unistd.h> <fcntl.h>
void main()
{
int fd=0;
char buffer[10];
fd = open("/home/fifo",O_RDONLY);
read(fd,buffer,8);
printf("read data is %s\n",buffer);
close(fd);
unlink("/home/fifo");
}
-------------------------------------------------------------------------------------------------------------------
3信号通信
说明:linux当中所有的信号都定义在/usr/include/asm/signal.h中
常用信号标志:SIGKILL:该信号结束接收该信号的进程
SIGSTOP:来自键盘或调试程序的停止信号
SIGINT:来自键盘的中断信号
SIGHUP:从终端上发出的结束信号
SIGHLD:子进程停止或结束时通知父进程的信号
------------------------------------------------------------------------------------------------------------------
1,发送信号
/*****************************************************************************
函数名:kill
函数原型:int kill(pid_t pid,int sig)
函数功能:向一个进程发送信号
所属头文件:<signal.h> <sys/types.h>
返回值:成功时:返回0
失败时:返回-1
参数说明:Sig:用来指明要发送的信号。
pid:pid>0:指向接收信号进程的PID。
Pid=0:将信号发送给目前进程相同进程组的所有进程。
Pid=-1:将信号广播发送给系统所有的进程。
Pid<0:将信号发送给进程组识别码为pid绝对值的所有进程。
****************************************************************************/
2设置信号处理的方式
/*****************************************************************************
函数名:signal
函数原型:sig_t signal(int signum, sig_t handler)
Void(*signal(int signum, void(*handler)(int)))(int)
Typedef void(*sig_t)(int)
函数功能:信号处理
所属头文件:<signal.h>
返回值:成功时:返回先前的信号处理函数指针
失败时:返回SIGERR(-1)
参数说明:signum:设置辛亥处理函数所依赖的信号编号
Handler:信号处理函数
如果handler不是函数指针,则必须是下列常数之一
SIG_IGN:忽略参数signum指定的信号
SIG_DFL:将参数signum指定的信号重设为预设的信号处理方式
第三:用户自己编写一个信号处理函数来处理
****************************************************************************/
3,进程等待
/*****************************************************************************
函数名:pause
函数原型:int pause(void)
函数功能:让进程暂停直到信号出现
所属头文件:<unistd.h>
返回值:只返回-1
参数说明:无
****************************************************************************/
代码分析:
-------------------------------------------------------------------------------------------------------------------
/******************************进程处理******************************/
#include <unistd.h> <sys/types.h> <stdio.h> <signal.h>
void main(int argc,char *argv[])
{
pid_t pid;
pid = atoi(argv[1]);
kill(pid,SIGINT);
}
/******************************发送信号给进程******************************/
#include <unistd.h> <signal.h> <stdio.h>
void myfunc(int a)
{
printf("the signal to dell\n");
}
void main()
{
signal(SIGINT,myfunc);
pause();
}
----------------------------------------------------------------------------------------------------------------------
七.信号量互斥编程
/*****************************************************************************
1创建和打开信号量
/*****************************************************************************
函数名:semget
函数原型:int semget(key_ key,int nsems,int semflag)
函数功能:打开信号量,当Key所指定的信号量不存在的时候,并且Semflag标识中
包含了IPC-CREAT标志时,去创建一个信号量集合。
所属头文件:<sys/types.h> <sys/ipc.h> <sys/sem.h>
返回值:成功:返回信号量的IPC标示符,
失败:返回-1,错误原因保存在errno中
EACCESS:没有权限。
EEXIST:信号灯已经存在,无法创建。
EIDRM:信号灯集已经删除。
ENOENT:信号灯集不存在,同时没有使用IPC_CREAT.
ENOMEM:没有足够的内存创建信号灯集。
ENOSPC:超出限制。
参数说明:key:要打开的信号量的键值,可用ftok()函数获取。
Nsems:创建的信号量集合中的个数。
Semflag:表示操作类型,也可用于信号灯的访问权限。
****************************************************************************/
2获得IPC键值
/*****************************************************************************
函数名:ftok
函数原型:key_t ftok(const char *pathname,int pid_id)
函数功能:通过文件路径名和子序列,获得system V IPC键值
所属头文件:<sys/types.h> <sys/ipc.h>
返回值:成功:返回信号量的IPC键值,
失败:返回-1,错误原因保存在errno中
参数说明:pathname:指定的带路径的文件名
Pid_id:子序列id,或工程id
****************************************************************************/
3操作信号量
/*****************************************************************************
函数名:semop
函数原型:int semop(int semid, struct sembuf *sops, unsigned nsops)
函数功能:操作信号量集合里面的信号灯
所属头文件:<sys/types.h> <sys/ipc.h> <sys/sem.h>
返回值:成功:返回共享内存的起始地址。
失败:返回-1。
参数说明:semid:要操作信号量集的标示符。
Sops:指向待操作的的结构体(数组),sembuf 结构体包含了对某个信号灯的
操作方法的信息,其成员如下:
Unsigned short sem_num:要操作的信号灯编号, 从0开始。
Short sem_op:为正数时代表释放信号灯。
为负数时代表获取信号灯,获取失败,进程等待。
Short sem_flag:操作信号灯的标识。
Nsops:用来指定要操作的信号量个数
****************************************************************************/
4初始化信号量
/*****************************************************************************
函数名:semctl
函数原型:int semctl(int semid, int semnum, int cmd,union semun arg)
函数功能:操作信号量集合里面的信号灯
所属头文件:<sys/types.h> <sys/ipc.h> <sys/sem.h>
返回值:成功:返回命令相关的正数
失败:返回-1。
参数说明:semid:信号灯的ID。
semnum:操作信号灯的编号。
cmd:控制命令,常用的命令有:
IPC_RMID:将信号灯集从内存从中删除。
GETPID:获得信号灯的ID。
GATVAL:获得信号灯的ID。
SETVAL:设置信号灯的ID。
Arg:是一个共同体类型的副本,其中各个量的使用情况和cmd设置有关。
****************************************************************************/
参考例程:
-----------------------------------------------------------------------------------------------------------------
/*************************A进程创建信号量*******************************/
#include <unistd.h> <sys/sem.h> <sys/types.h>
#include <sys/stat.h> <fcntl.h> <sys/ipc.h>
void main()
{
int fd = 0 ; int sops_flag,rest = 0; key_t key;
struct sembuf sops;
/*获取键值*/
key = ftok("/home/",1);
/*创建信号量*/
sops_flag = semget(key,1,IPC_CREAT);
/*获取信号量*/
rest = semctl(sops_flag,0,SETVAL,1);
printf("the init sopo is: %d\n",rest);
sops.sem_num = 0;
sops.sem_op = -1;
semop(sops_flag,&sops,1);
/*打开文件*/
fd = open("/home/txt.c",O_RDWR|O_APPEND);
write(fd,"math cless",11);
sleep(5);//等待信号
write(fd,"is quxiao",10);
/*释放信号量*/
sops.sem_num = 0;
sops.sem_op = +1;
semop(sops_flag,&sops,1);
close(fd);
}
/*****************************B进程写文件***********************************/
#include <unistd.h> <sys/sem.h> <sys/ipc.h>
#include <sys/types.h> <sys/stat.h> <fcntl.h>
void main()
{
int fd = 0; key_t key; int sops_flag; struct sembuf sops; int rest = 0;
/*获取键值*/
key = ftok("/home/",1);
/*创建信号量*/
sops_flag = semget(key,1,IPC_CREAT);
rest = semctl(sops_flag,0,GETVAL);
printf("the valye is %d\n",rest);
/*获取信号量*/
sops.sem_num = 0;
sops.sem_op = -1;
semop(sops_flag,&sops,1);
fd = open("/home/txt.c",O_RDWR|O_APPEND);
write(fd,"einglish cless",15);
sleep(5);
write(fd,"is exam",8);
/*释放信号量*/
sops.sem_num = 0;
sops.sem_op = +1;
semop(sops_flag,&sops,1);
close(fd);
}
---------------------------------------------------------------------------------------------------------------------
八.信号量同步编程
/*****************************************************************************/
信号同步编程有生产者和消费者:
1.生产者要做的有两件事:A.创建信号量。
B.初始化信号量为0。
C.只释放信号量能不获取信号量。
2.消费者要做的事: A.创建信号量。
B.只获取信号量不释放信号量。
例程分析:
----------------------------------------------------------------------------------------------------------------------/********************************生产者代码***********************************/
#include <unistd.h>
#include <fcntl.h>
#include <sys/sem.h>
#include <sys/stat.h>
#include <sys/ipc.h>
void main()
{
int fd=0,rest=0,sops_flag=0,key=0;
struct sembuf sops;
key = ftok("/home/",1);
sops_flag = semget(key,1,IPC_CREAT);
rest = semctl(sops_flag,0,SETVAL,0) ;
fd = open("./txt.c",O_RDWR|O_CREAT,0775);
sleep(10);
write(fd,"the data write seccussed",25);
sops.sem_num = 0;
sops.sem_op = +1;
sops.sem_flag = SEC_UNDO;
semop(sops_flag,&sops,1);
close(fd);
}
/*******************************消费者代码********************************/
#include <unistd.h>
#include <fcntl.h>
#include <sys/sem.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <stdlib.h>
void main()
{
int fd=0,rest=0,sops_flag=0,key=0;
struct sembuf sops;
key = ftok("/home/",1);
sops_flag = semget(key,1,IPC_CREAT);
sops.sem_num = 0;
sops.sem_op = -1;
sops.sem_flag = SEC_UNDO;
semop(sops_flag,&sops,1);
system("cp ./txt.c ./txt1.c");
}
---------------------------------------------------------------------------------------------------------------------
九。共享内存通讯
/*****************************************************************************/
1.基本概念。
共享内存是IPC机制中的一种,顾名思义,它允许两个相关的进程访问同一段内存,这是传递数据一种非常有效的方式。
共享内存的作用:在多个不相关进程间传递数据的作用。
2.函数学习
1》创建和获取共享内存shmget();
函数原型: int shmget(key_t key, size_t size, int shmflg);
头文件: #include <sys/ipc.h>
#include <sys/shm.h>
函数功能:创建或者获取一段共享内存,返回内存的描述符。
返回值: 成功:创建或获取共享内存的描述符。
失败:-1 。
参数说明:key_t key:提供共享内存的相关IPC键值。
size:创建共享内存的大小。
shmflag: IPC_CREAT:创建一个新的共享内存。如果这个标志不使用,shmget()会发检查用户是否有访问权限一致的共享内存。
2》映射共享内存shmat()
函数作用:指定的共享内存映射到进程的地址空间中。
函数原型:void *shmat(int shmid, const void *shmaddr, int shmflg);
头文件:#include <sys/types.h>
#include <sys/shm.h>
返回值:成功:返回映射到进程地址空间中的地址。
失败:
参数说明:
check to see if the user has permission to access the seg
shmget() will find the segment associated with key and
linux系统调用函数---12的更多相关文章
- 关于Linux系统调用,内核函数【转】
转自:http://blog.csdn.net/ubuntulover/article/details/5988220 早上听人说到某个程序的一部分是内核态,另一部分是用户态,需要怎么怎么.当时突然想 ...
- linux常见系统调用函数列表
以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完 ...
- Linux系统调用--getrusage函数详解
Linux系统调用--getrusage函数详解 功能描述: 获得进程的相关资源信息.如:用户开销时间,系统开销时间,接收的信号量等等; 用法: #include <sys/t ...
- LInux文件基础知识和文件目录操作(系统调用函数方式)
1.进程是处于活动状态的程序,某个用户通过操作系统运行程序所产生的进程代表着该用户的行为.如果用户不具备访问某个目录和文件的权限,那么该用户的进程也不能访问. 2.Linux系统中文件安全机制是通过给 ...
- (转)linux下的系统调用函数到内核函数的追踪
转载网址:http://blog.csdn.net/maochengtao/article/details/23598433 使用的 glibc : glibc-2.17使用的 linux kerne ...
- 【Linux】文件操作函数(系统调用函数)
重点在于学习--思路与方法 举一反三 一.文件描述符 系统分配给文件的数字编号 二.函数学习 P.S.Man命令使用方法 manual 前三个章节 命令:系统调用函数:库函数 man read //r ...
- 别出心裁的Linux系统调用学习法
别出心裁的Linux系统调用学习法 操作系统与系统调用 操作系统(Operating System,简称OS)是计算机中最重要的系统软件,是这样的一组系统程序的集成:这些系统程序在用户对计算机的使用中 ...
- Linux系统调用(转载)
目录: 1. Linux系统调用原理 2. 系统调用的实现 3. Linux系统调用分类及列表 4.系统调用.用户编程接口(API).系统命令和内核函数的关系 5. Linux系统调用实例 6. Li ...
- linux select函数详解
linux select函数详解 在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select函数的参数会告诉内核: •我们所关心的文件描述符 •对每个描述符,我们所关心的状 ...
随机推荐
- (转)azkaban job参数说明
azkaban的工作流中的参数可以分为如下几个类型:azkaban UI 页面输入参数, 环境变量参数, job作业文件中定义的参数,工作流的用户定义的属性文件,上游作业传递给下游的参数,工作流运行时 ...
- 【转】WKT、SRID、EPSG概念
http://www.cnblogs.com/jackdong/archive/2010/12/20/1911558.html 之前一直对WKT.EPSG.SRID不是很理解,总是混淆,今天看了一下, ...
- Spark编程指南
1.在maven里面添加引用,spark和hdfs的客户端的. groupId = org.apache.spark artifactId = spark-core_2.9.3 version = 0 ...
- spring boot 使用拦截器 无法注入 配置值 、bean问题
参考:https://www.cnblogs.com/SimonHu1993/p/8360701.html 一定要将 拦截器组件 交给spring容器进行管理,这样才能注入配置值,或者注入bean: ...
- 【Python】 tempfile模块 临时文件和目录的处理
[tempfile] 惊奇地又发现了一个比较有意思的小模块. 在一些场景中我们经常需要自动生成一些临时文件,当然用简单的open函数,来创建一个隐藏文件可以实现.不过tempfile这个模块把一些有的 ...
- Android Studio xcode单步调试 WebRTC Android & iOS
mac环境 如何在 Android Studio 里单步调试 WebRTC Android 的 native 代码. WebRTC 代码下载 depot tools 是 chromium 代码库管理工 ...
- 微信小程序——template的使用方法
今天需要做一个[我的订单]页面,订单有几种状态,觉得把订单列表封装成一个模板更好.下面讲一下,如何用小程序自带的template构建一个模板. 1.构建订单列表模板页,命名为 [order.wxml] ...
- SpringMVC深度探险(四) —— SpringMVC核心配置文件详解
在上一篇文章中,我们从DispatcherServlet谈起,最终为读者详细分析了SpringMVC的初始化主线的全部过程.整个初始化主线的研究,其实始终围绕着DispatcherServlet.We ...
- ViewPager一屏显示多个item,及边缘滑动事件优化
关于ViewPager显示两边的item方法,网络上是方法都在ViewPager外包一个Layout, 然后设置ViewPager和外面的Layout的clipChildren="false ...
- android调用系统的自定义裁剪后得到的图片不清晰,使用MediaStore.EXTRA_OUTPUT获取缓存下的清晰图片
在使用系统自带的剪切图片工具时,通常只能设置一些比较小的值,像 intent.putExtra("outputX", 320); intent.putExtra("out ...