Linux高级编程
dmfrm
这个作者很懒,什么都没留下…
展开
-
Linux C 实现mycp 可以显示文件拷贝进度
在Linux系统里面用到 cp命令复制不能显示文件拷贝的进度,也不能计算还有多长时间文件可以 拷贝结束,现在写一个程序可以显示文件拷贝的进度。思路:当前目录下面有一个1G大小的bigfile文件当我在命令行下面输入ls -lh bigfile,我会得到这个文件的详细信息,当然也可以看到文件的大小。我们可以用popen函数,把执行之后的结果”-rw-rw-r– 1 nii nii 1000M 7月原创 2015-07-15 18:34:40 · 4725 阅读 · 0 评论 -
Linux的进程函数fork的使用
Linux的进程包含三大部分,进程控制块、正文段和数据段,保证进程可以实现共享数据,共享正文。pid_t fork(void);函数功能:产生一个子进程 返回值: 1)在父进程中,fork返回新创建子进程的进程ID; 2)在子进程中,fork返回0; 3)如果出现错误,fork返回一个负值;下面是实例代码:#include <unistd.h> #include <st原创 2015-08-06 23:39:20 · 481 阅读 · 0 评论 -
Linux进程的用户态和内核态的切换方式
1、用户态和内核态的概念用户态: 程序运行在非特权状态,当前的进程只能使用当前进程的资源,不能进入其他的进程空间或内核空间。内核态: 简单的理解为,所有的系统资源都可以使用。2、用户态和内核态的切换方式有三种系统调用 比如调用fork()函数产生进程的时候。程序异常 比如5/0,当除数为0的时候,就会产生异常。设备中断 当外围设备完成用户请求的操作后,会向CPU发出相应的原创 2015-08-07 09:44:41 · 2735 阅读 · 0 评论 -
Linux C的select函数的使用
1、select函数简介int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval*timeout); 当服务器响应多个客户端连接的时候,需要定义一个线程函数,在每一个线程函数里面处理该连接,进行数据的读写,且connect、accept、recv或recvfrom这样的函数都是阻塞的。原创 2015-08-31 22:57:14 · 13120 阅读 · 1 评论 -
Linux内核有什么功能?
1、进程管理 内核负责创建和销毁进程, 并处理它们与外部世界的联系(输入和输出). 不同进程间通讯(通过信号, 管道, 或者进程间通讯原语)对整个系统功能来说是基本的, 也由内核处理. 另外, 调度器, 控制进程如何共享 CPU, 是进程管理的一部分. 更通常地, 内核的进程管理活动实现了多个进程在一个单个或者几个 CPU 之上的抽象.2、内存管理 计算机的内存是主要的资源, 处理它所用的策略对系统原创 2015-08-23 00:36:41 · 8817 阅读 · 0 评论 -
Linux系统的信号详解
一、信号类型 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGS原创 2015-09-01 14:54:11 · 4027 阅读 · 0 评论 -
Linux C编程常用的API函数
最近找到了一个特别好的在线Linux C API函数,给大家分享一下。1. 字符测试函数2. 字符串操作3. 内存管理函数4. 日期与时间函数5. 数学函数6. 文件操作函数7. 进程管理函数8. 文件权限控制9. 信号处理函数10. 接口处理函数11. 环境变量函数12. 终端控制函数原创 2015-09-14 00:33:39 · 3803 阅读 · 0 评论 -
局域网LanQQ聊天项目
一、简介 在汇文上嵌入式培训课,做了这个局域网内的QQ聊天项目,收获很多,把这段经历写成博客,自己也总结一下,同时也分享一下经验。二、项目要求在局域网内构建功能类似于QQ的综合的聊天系统,该聊天系统主要包括以下功能: (1) 服务端 1.1 新用户注册,老用户验证登录,管理员可以对用户实行管理,管原创 2015-09-13 10:16:51 · 2475 阅读 · 2 评论 -
局域网LanQQ聊天项目(二)服务器和客户端整体框架的搭建
这个项目分为一个服务器、一个聊天的客户端、一个后台管理的客户端原创 2015-09-13 11:29:58 · 2959 阅读 · 0 评论 -
局域网LanQQ聊天项目(一)数据库与通信协议设计
在做项目之前要把整体框架搭好,对于这个项目而言,数据库的设计与服务器和客户端之间的通信协议制定至关重要。 数据库而言,数据库的制定要考虑全面,如果在中途写代码的时候发现,发现数据库表设计不合理或者是缺少字段,这样严重影响项目的进度,会做很多无用功,因此在写代码之前,一定要把数据库设计的合理、完整。 对于这个项目主要是客户端和服务器之间的通信,通信协议是比较多原创 2015-09-13 10:40:19 · 2353 阅读 · 0 评论 -
Linux的信号 SIGALRM和SIGINT的使用示例
(1)SIGALRM信号的使用#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <signal.h>void asr(int nSignal){ printf("signal is : %d\n",nSignal); alarm(5);}int main(){ int nCount原创 2015-09-01 15:03:27 · 9721 阅读 · 0 评论 -
Linux系统sigaction函数的使用示例
一、函数原型int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);signum参数指出要捕获的信号类型,act参数指定新的信号处理方式,oldact参数输出先前信号的处理方式(如果不为NULL的话)。二、 struct sigaction结构体介绍s原创 2015-09-01 16:18:59 · 9971 阅读 · 0 评论 -
Linux系统文件描述符理解
1、查看系统文件描述符个数。以下是查看Linux文件描述符的三种方式:[root@localhost ~]# sysctl -a | grep -i file-max --colorfs.file-max = 392036[root@localhost ~]# cat /proc/sys/fs/file-max392036[root@localhost ~]# ulimit -n1024原创 2015-08-31 11:01:08 · 2404 阅读 · 0 评论 -
Linux C 实现mysleep数
先了解一下SIGALRM信号、alarm函数和pause函数。SIGALRM 时钟定时信号, 计算的是实际的时间或时钟时间. alarm函数使用该信号.unsigned int alarm(unsigned int seconds);alarm也称为闹钟函数,它可以在进程中设置一个定时器,当定时器指定的时间到时,它向进程发送SIGALRM信号。如果忽略或者不捕获此信号,则其默认动作是终止调用该原创 2015-07-15 14:53:43 · 679 阅读 · 0 评论 -
Linux多线程如何避免死锁
1、线程死锁产生的必要条件:(1)互斥条件:一个资源每次只能被一个进程使用。 (2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 (3)不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。 (4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。2、如何避免死锁&bnsp;网上对于如何避免死锁方法很多,我在这里列举两个比较常用的方法。(1)设原创 2015-08-23 23:09:40 · 2088 阅读 · 0 评论 -
Linux Tcp客户端和服务器端代码实现
1、int socket(int domain, int type, int protocol);函数解析功能:创建socket,也就是创建一个socket描述符 参数: domain :使用哪个协议族,一般情况下设为AF_INET(IPv4) type: 服务类型,主要有SOCK_STREAM流服务(TCP协议使用),SOCK_DGRAM数据报服务(UDP协议使用) protoc原创 2015-07-30 23:59:22 · 7302 阅读 · 0 评论 -
Linux C open打开文件,然后清空文件内容
1、函数简介int open(constchar*pathname,intflags,mode_tmode); 打开一个文件,获得一个文件描述符int ftruncate(int fd, off_t length) ftruncate()会将参数fd指定的文件大小改为参数length指定的大小。参数fd为已打开的文件描述词,而且必须是以写入模式打开的文件。如果原来的文件件大小比参数length原创 2015-08-14 23:35:26 · 23351 阅读 · 1 评论 -
Linux C标准IO库函数详解 一
1、open/close open函数可以打开或者创建一个文件#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);返回值:成功原创 2015-08-30 14:21:37 · 1853 阅读 · 0 评论 -
强制使用处于TIME_WAIT的TCP状态的socket地址
在bind函数之前添加上这句话就可以了。int isReuse = 1;setsockopt(nSocketFd,SOL_SOCKET,SO_REUSEADDR,(const char*)&isReuse,sizeof(isReuse));原创 2015-08-30 18:59:24 · 491 阅读 · 0 评论 -
Linux进程与线程的区别和联系
1、两者区别:(1)进程是比较大的单位,一个进程可以有多个线程,一个线程只能被一个进程拥有。 (2)进程是资源分配的基本单位,线程是处理机制调度的最小单位,所有的线程共享其所属进程的所有资源与代码。 (3)线程执行过程中容易同步,而进程之间需要通信进行同步。 (4)线程共享进程数据的同时,拥有自己的堆与栈。2、线程的一些优点: (1)由于线程用所属进程的一些资源,线程的划分尺度更小,并发性比原创 2015-08-30 19:42:49 · 801 阅读 · 0 评论 -
Linux文件系统简介
1、文件系统里面的几个概念超级块块组描述符表数据块块位图inode节点inode位图2、概念理解 (1)超级块 在Linux系统中把磁盘分成一个个的数据块来存储数据,超级块存储整个分区的系统信息,包括 块大小,文件系统版本号,上次mount的时间等等 (2)块组描述符表 整个分区有多少个块组,就有多少个块组描述符,每个块组描述符存储该块组的信息。原创 2015-08-30 00:37:55 · 534 阅读 · 0 评论 -
Linux进程通信---共享内存 代码实现
1、什么是共享内存 共享内存可以从字面上去理解,就把一片逻辑内存共享出来,让不同的进程去访问它,修改它。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入原创 2015-08-30 23:05:45 · 2379 阅读 · 0 评论 -
Linux地址信息函数:获取本端和远端的socket地址
1、在某些情况下想知道一个连接着的socket的本端地址,以及远端的socket地址,可以使用下面的两个函数。获取本端的socket地址:#include <sys/socket.h>int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);获取远端的socket地址:#include <sys/socket.h>原创 2015-08-30 17:28:46 · 2403 阅读 · 0 评论 -
Linux进程通信---信号量 代码实现
1、信号量使用流程(1)获得keyVal值值要一样。keyVal = ftok(PATH_SHM,PRI_SHM_ID);(2)创建信号量或打开信号量的键值nSemid = semget(keyVal,1,IPC_CREAT);(3)设置信号量 semctl(nSemid,0,SETVAL,1)(4)判断现在该资源是否被加锁,如果加锁则阻塞,如果不枷锁,则该进程把这块资源加锁,现在由这个进程使用。在原创 2015-08-30 23:57:19 · 1333 阅读 · 0 评论 -
Linux进程间通信---有名管道 代码实现
一、管道通信的注意事项 (1)执行mkfifo file命令来创建一个管道文件。[admin@localhost code]$ mkfifo pipe[admin@localhost code]$ ls -ltotal 0'''p'rw-rw-r-- 1 admin admin 0 8月 30 19:52 pipe //p就代表是管道文件(2)如果只把管道的写打开,管道是不通的,是写不原创 2015-08-30 20:15:37 · 2137 阅读 · 0 评论 -
Linux进程通信---消息队列 代码实现
1、消息队列函数的使用“消息队列”是在消息的传输过程中保存消息的容器。当消息从队列内取出后,相应的消息就从队列中删除了。(1)ftok获得唯一的key值key_t ftok(const char *pathname, int proj_id);pathname就是你指定的文件名(已经存在的文件名),一般使用当前目录proj_id就是你指定的id值(2)msgget用于创建一个新的或打开一个已经存原创 2015-08-30 23:29:17 · 800 阅读 · 0 评论 -
哲学家吃饭问题 代码实现如何 避免线程死锁
问题描述: 假设有5个哲学家,他们花费一生中的时光思考和吃饭。这些哲学家共用一个圆桌,每个哲学家都有一把椅子。在桌子中央是一碗通心面,在桌子上放着5只筷子。当一个哲学家思考时,他与其他同事不交互。时而,哲学家会感到饥饿,并试图拿起与他相近的两只筷子(他与邻近左、右之间的筷子)。一只筷子一次只能被一个哲学家拿起。显然,他不能从其他哲学家手里拿走筷子。当一个饥饿的哲学家同时有两只筷子时,他就可原创 2015-08-31 21:29:23 · 2287 阅读 · 0 评论 -
Linux C打印所有的环境变量
1、在终端显示环境变量执行env命令nii@mmch:~/code$ envLC_PAPER=zh_CN.UTF-8LC_ADDRESS=zh_CN.UTF-8XDG_SESSION_ID=4LC_MONETARY=zh_CN.UTF-8TERM=xtermSHELL=/bin/bashSSH_CLIENT=192.168.217.1 34476 22LC_NUMERIC=zh_CN原创 2015-08-31 14:18:18 · 5196 阅读 · 0 评论