Linux C 程序 (15)

dup ,dup2,fcntl,ioctl系统调用

1 1. dup ,dup2 函数
2 int dup(int oldfd)
3 int dup(int oldfd , int newfd)

dup用来复制参数oldfd的文件描述符
duo2可以用newfd来指定新文件描述符的数值

2.fcntl函数
对已经打开的文件描述符进行各种控制操作,以及改变已经打开文件的各种属性

3.ioctl函数
控制设备,不能用其他函数进行控制操作都可以用ioctl来进行

3.文件属性的操作
 1.  shell里可通过ls来获取文件属性,那么在程序里怎么获取文件属性呢?
         用到stat/fstat/lstat

1         man 2 stat
2          #include<sys/types.h>
3          #include<sys/stat.h>
4          #include<unistd.h>
5          int stat(const char *file_name,struct stat *buf);
6          int fstat(int filedes,struct stat *buf);
7          int lstat(const char *fime_name ,struct stat *buf);

stat 获取由参数file_name指定的文件名的状态信息,保存参数到struct stat *buf中
         fstat   与stat 区别,fstat通过文件描述符来指定文件
         lstat  与stat,对于符号连接文件,lstat返回的是符号连接文件本身的状态信息。而stat返回的是符号连接文件指向的文件的状态信息。

 1            struct stat {
 2                dev_t     st_dev;     /* ID of device containing file */
 3                ino_t     st_ino;     /* inode number */
 4                mode_t    st_mode;    /* protection */
 5                nlink_t   st_nlink;   /* number of hard links */
 6                uid_t     st_uid;     /* user ID of owner */
 7                gid_t     st_gid;     /* group ID of owner */
 8                dev_t     st_rdev;    /* device ID (if special file) */
 9                off_t     st_size;    /* total size, in bytes */
10                blksize_t st_blksize; /* blocksize for file system I/O */
11                blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
12                time_t    st_atime;   /* time of last access */
13                time_t    st_mtime;   /* time of last modification */
14                time_t    st_ctime;   /* time of last status change */
15            };

eg:获取文件属性
                                                                                                                                                                                              79,0-1        Bot

 1 #include<stdio.h>
 2 #include<time.h>
 3 #include<sys/stat.h>
 4 #include<unistd.h>
 5 #include<sys/types.h>
 6 #include<errno.h>
 7
 8 int main(int argc , char * argv[]){
 9         struct stat buf;
10         /*check param number*/
11         if(argc != 2){
12                 printf("Usage mystat  <file_name>\n");
13                 exit(0);
14         }
15         /*get file attr*/
16         if(stat(argv[1],&buf) == -1){
17                 perror("stat:");
18                 exit(1);
19         }
20         //print file attr
21         printf("device is :%d\n",buf.st_dev);
22         printf("inode is :%d\n",buf.st_ino);
23         printf("mode is :%d\n",buf.st_mode);
24         printf("number of hard links  is :%d\n",buf.st_nlink);
25         printf("user ID of owner  is :%d\n",buf.st_uid);
26         printf("group ID of owner  is :%d\n",buf.st_gid);
27         printf("device type (if inode device ) is :%d\n",buf.st_rdev);
28
29         printf("total size ,in bytes  is :%d\n",buf.st_size);
30         printf("blocksize for filesystem I/O  is :%d\n",buf.st_blksize);
31         printf("number of blocks allocated is :%d\n",buf.st_blocks);
32
33         printf("time of last access  is :%s\n",ctime(&buf.st_atime));
34         printf("time of last modification  is :%s\n",ctime(&buf.st_mtime));
35         printf("time of last change  is :%s\n",ctime(&buf.st_ctime));
36
37         return 0;
38
39 }
40 output :
41 [[email protected] C]$ ./my_chmod  example.c
42 device is :2050
43 inode is :407124
44 mode is :33152
45 number of hard links  is :1
46 user ID of owner  is :500
47 group ID of owner  is :500
48 device type (if inode device ) is :0
49 total size ,in bytes  is :0
50 blocksize for filesystem I/O  is :4096
51 number of blocks allocated is :0
52 time of last access  is :Mon Jan  5 23:23:36 2015
53 time of last modification  is :Mon Jan  5 23:29:37 2015
54 time of last change  is :Mon Jan  5 23:29:37 2015

2.设置文件属性

 1 chmod/fchmod , chown/fchown/lchown,truncate/ftruncate,utime,umask
 2 1.chmod/fchmod
 3 修改文件的存取权限
 4 2.chown/fchown/lchown
 5 修改文件的用户id和组id
 6 3.ftruncate/truncate
 7 改变文件大小
 8 4.utime
 9 改变文件的st_mtime和st_ctime域,即存取时间和修改时间。
10 5.umask
11 使用文件创建时使用的屏蔽字
时间: 2024-11-05 21:35:24

Linux C 程序 (15)的相关文章

linux 统计 程序 运行时间

测试 代码运行时间 linux 中的 <sys/time.h> 中 有个函数可以获取当前时间,精确到 微秒 ---->  gettimeofday() 1 #include <sys/time.h>       // int gettimeofday(struct timeval *tv, struct timezone *tz); 2 /********************************************* 3 * struct timeval 4 *

Linux C程序的编译

Linux C程序的编译过程 学习一门语言程序,本人觉得还是得学习它的编译规则,现在,通过小例子小结下自己对C编译的认识. /*test.c     了解C程序的编译*/ #include <stdio.h>int main(void){ printf("Hello World!\n"); return 0;} 对于test.c,我们常用一步编译到位的命令是: gcc -o test test.c  或者  gcc test.c -o test 实际上,上面的这个编译命令包

嵌入式linux应用程序调试方法

嵌入式linux应用程序调试方法 四 内存工具 17 4.1 MEMWATCH 17 4.2 YAMD 22 4.3 Electric Fence 24 五 C/C++代码覆盖.性能profiling工具 24 5.1 用gcov来测试代码覆盖率 25 5.2 使用gprof来优化你的C/C++程序 35 四 内存工具 您肯定不想陷入类似在几千次调用之后发生分配溢出这样的情形. 许多小组花了许许多多时间来跟踪稀奇古怪的内存错误问题.应用程序在有的开发工作站上能运行,但在新的产品工作站上,这个应用

Linux安装程序Anaconda分析

1.概述 Anaconda是RedHat.CentOS.Fedora等Linux的安装管理程序.它能够提供文本.图形等安装管理方式,并支持Kickstart等脚本提供自己主动安装的功能.此外,其还支持很多启动參数,熟悉这些參数可为安装带来非常多方便.该程序的功能是把位于光盘或其它源上的数据包,依据设置安装到主机上.为实现该定制安装,它提供一个定制界面,能够实现交互式界面供用户选择配置(如选择语言,键盘,时区等信息).Anaconda的大部分模块用Python编写,有少许的加载模块用C编写. An

linux应用程序地址布局

Linux应用程序在内存中的布局,由高地址到低地址依次为:栈.堆.BSS段.数据段.代码段.代码段的起始地址固定为0x8048000,无论哪一个应用程序它的代码段起始地址一定是0x8048000,这里的地址虚拟地址,映射到不同的物理地址中去. 查看程序各段的地址 ps    aux     这个命令用于查看进程的ID,比如我运行一个可执行程序addr 可以看到addr的进程ID是24048.然后用cat命令查看进程在内部的布局 cat    /proc/进程ID/maps,这里我们是cat   

Linux 应用程序 之 IO编程(一)

我的linux 环境是windows8.1 + VMware6.5.1+  Fedora14,参考书籍:第六章 链接:Linux应用程序开发详解(1-11).pdf 我利用一个SSH软件SSH Secure File Transfer Client 来从Linux传输文件 来张虚拟机运行Fedora的图: 下面步入正题: IO最基本操作: 1 //hello.c 2 #include <unistd.h> 3 #include <sys/types.h> 4 #include &l

Linux C++程序进行性能分析工具gprof使用入门

性能分析工具 软件的性能是软件质量的重要考察点,不论是在线服务程序还是离线程序,甚至是终端应用,性能都是用户体验的关键.这里说的性能重大的范畴来讲包括了性能和稳定性两个方面,我们在做软件测试的时候也是要重点测试版本的性能表现和稳定性的.对于软件测试过程中发现的性能问题,如何定位有很多的方法.基本的方法可能是开发者对代码进行review,或者是使用一些工具对代码进行性能分析.常见的性能分析tuning工具有哪些呢?下面两篇文章做了详细的总结: https://computing.llnl.gov/

《Linux高性能服务器编程》学习总结(七)——Linux服务器程序规范

第七章      Linux服务器程序规范 服务器程序除了需要网络通信外,还应该考虑很多其他的细节,而这些细节很多很杂,但又基本是模板式的.1)服务器程序基本都是以后台形式运行的,没有控制终端,不能接受用户输入,其父进程通常是init.2)服务器程序有一套日志系统.3)服务器程序以某个专门的非root身份运行.4)服务器通常是可配置的.5)服务器进程启动时通常会生成一个PID文件以记录后台进程的PID.6)服务器程序同城需要考虑系统资源和限制. 服务器一般使用syslog函数与rsyslogd守

Linux服务器程序规范

除了网络通信外,服务器程序还必须考虑许多其他细节问题,零碎,但基本上时模板式的. ---引 Linux服务器程序一般以后台形式运行.后台程序又称守护进程.它没有控制终端,因而也不会意外接受用户输入.守护进程的父进程一般是init进程(pid=1). Linux服务器程序通常有一套日志系统,它至少能输出日志到文件,有的高级服务器可以输出日志到专门的UDP服务器.大部分后台进程都在/var/log下有自己的日志目录. Linux服务器程序一般以某个专门的非root身份运行.mysqld, httpd