自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

echo_bright_的博客

计算机网络基础/ Linux网络编程

  • 博客(15)
  • 资源 (2)
  • 收藏
  • 关注

原创 Linux系统上的popen()库函数

《Unix环境高级编程》在popen和pclose函数章节说,常见的操作是创建一个连接到另一进程的管道,然后读其输出或向其发生输入,所以标准I/O库为实现这些操作提供了两个函数popen和pclose。这两个函数实现的操作是:创建一个管道,fork一个子进程,关闭管道的不使用端,exec一个shell以执行命令,等待命令终止。 函数的原型:FILE *popen(const char *comm

2017-04-28 17:57:07 16542 2

原创 Linux系统进程间通讯-信号

1. 进程间通讯各进程间在虚拟内存空间上是独立的,以32位的操作系统为例,虚拟空间是4G。程序开发过程中,创建进程一般都会涉及到进程间的通讯。前面学的,子进程可以通过exit()返回错误码(0-255)返回到父进程,父进程用wait()来接收。exit()返回错误码存在局限性,通讯不仅要是数据交互,还可以互相影响,如杀死进程命令”kill -9 进程PID”,kill是发信号之意,即给进程发送9信号

2017-04-26 11:37:29 449

原创 Linux系统调用dup()和dup2()

dup()和dup2()函数都可以用来复制一个文件描述符,原型为:int dup(int oldfd);int dup2(int oldfd, int newfd);函数执行成功返回新的文件描述符,失败则返回-1。 dup()函数返回的新的文件描述符是当前可用文件描述符中最小数值,示例代码:int main(void){ int fd; int new_fd; fd =

2017-04-25 19:03:44 11093

原创 Linux操作系统的进程组、会话

1. 进程程序是指的存储在存储设备上包含了可执行机器指令和数据的静态实体,可执行指令即二进制代码。进程是已经被操作系统从存储设备加载到内存,动态运行的指令和数据的集合,是运行中的动态实体。2. 进程组每个进程除了有一个进程ID、父进程ID外,它还有一个进程组ID,标识它属于一个进程组。进程组是一个或者多个进程的集合。这些进程并非孤立,它们之间或者是父子进程,或者功能有相近的联系。每个进程都有父进程,

2017-04-25 11:08:20 1161

原创 进程退出函数exit()

在多进程编程中(这里讲Linux平台),某个进程函数退出时调用exit()函数。它是属于标准库的函数,原型void exit(int status);参数status是退出状态码,它可由用户自定义。为避免子进程成为僵尸进程,父进程是调用wait()或者waitpid()来获取子进程的退出状态。父进程的wait()(或者waitpid())结合子进程的exit()可以得到: 1) 子进程是否正常退出

2017-04-24 10:03:23 3436

原创 Linux进程

1. execve()函数前面讲到的execX函数簇,它们都是标准库函数里的函数,也就是说它们是对系统调用API的封装,这个系统调用的API就是execve()函数,原型为:int execve(const char *filename, char *const argv[], char *const envp[]);调用方法还是类似之前:// 主调进程int main(void){ c

2017-04-22 16:17:43 288

原创 Linux进程和execX函数簇

1. 进程进程可以理解为正在内存中运行的程序的实例。每个进程都有一个进程描述符PID,且每个进程都是由其父进程创建的(init进程除外),所以都有父进程描述符PPID。pid_t getpid(void); //获取进程IDpid_t getppid(void); //获取父进程ID对于程序员来说,进程的作用不外乎是用来运行其他程序,即在某个进程中开启另一个进程去运行其他程序。这个”

2017-04-21 15:09:20 439

原创 Linux系统目录操作

Linux操作系统上关于目录操作的系统API是readdir(),”man 2 readdir”可以看到:因该函数会涉及到比较复杂的原理和调用过程,所以标准库已帮我们做了封装。事实上,在上面man结果中也明确说明 “一切皆是文件”是Linux的特点,因此,目录也是如此,只是目录存储的是该目录下所有文件及子目录文件的信息。1. 打开 / 关闭目录文件opendir()和closedir()分别是打开

2017-04-16 11:55:21 438

转载 函数的可重入和不可重入

https://www.ibm.com/developerworks/cn/linux/l-reent.html这是一篇描述重入函数和不可重入函数的文章。先把他copy过来: 在早期的编程中,不可重入性对程序员并不构成威胁;函数不会有并发访问,也没有中断。在很多较老的 C 语言实现中,函数被认为是在单线程进程的环境中运行。 不过,现在,并发编程已普遍使用,您需要意识到这个缺陷。本文描述了在并行和

2017-04-15 18:26:26 7890

原创 strtok和strtok_r函数的使用

strtok()和strtok_r()都是以特定字符串为分隔符来分隔源字符串,是属于string函数家的族函数。下面是基于实验得到的结论,实验环境为Linux Ubuntu11.04,gcc4.5.2。1. strtok()函数函数原型为:char *strtok(char *str, const char *delim);该函数的返回值是char型指针,也就是要返回分隔后的字符串。凡是返回指针的函

2017-04-14 17:34:16 4679

原创 Linux系统调用API容错机制

以open函数为例,该系统API原型为:int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);在c语言中,是不可能存在相同函数名的两个函数的,那么可以知道open函数是一个可变参函数,即open(const char *pathname, int flags,

2017-04-13 09:57:54 606

原创 标准库IO缓冲区

1. 实现间隔时间横向打印 * * * * * * 字符串效果很容易写出代码:int main(void){ int n = 6; while (n--) { printf("*"); usleep(100000); } printf("\n"); return 0;}发现运行结果并非是间隔100ms打印一个 * 而是等

2017-04-12 14:31:09 1420

原创 哈希表示例

哈希表的意义在于高效查找。对于查找来说,如果数据量特别大,二分查找和哈希表算法十分有用了。二分查找前面已经讲过,现来讲讲哈希表算法。 就像输入数据数组下标返回数组元素一样,这样的查找方式是最高效的了,哈希表就是这样一种数据结构。 假设现在有10个元素的数组,通过每一个元素可以确定它存在在哈希表中的哪一个位置(哈希表可以理解为一个特殊数组,它的数据成员也有下标),当下次要查找该元素时候,就可以通过

2017-04-09 17:38:53 1766 4

原创 二分查找

前面讲了排序的几种常见算法,我们知道排序的最终目的是方便且高效的查找,现来看看二分查找算法。 二分查找算法是在有序数组中用到的较为频繁的查找算法。举个例子,有如下数组:int a[] = {92, 98, 55, 86, 75, 82, 32, 66, 76};利用二分查找查找是否存在数值为55的数据,需要 1. 排序,得到a[9]的数据元素为: 32, 55, 66, 75, 76, 82,

2017-04-09 15:43:45 414

原创 基本排序算法

常见的排序算法有: 冒泡法(大学时c语言课程要求必须掌握的)、选择排序、交换排序以及插入排序,快速排序。现在来总结一下(以下排序都是从小到大排序)。1. 冒泡排序冒泡排序,实现过程是遍历要排序的数列,一次比较两个元素,若他们的顺序错误就把它们交换过来,一次遍历完毕后,便把最大的元素放到最右边。//冒泡排序void bubble_sort(void){ for (i = 0; i < MA

2017-04-09 14:58:57 292

Linux内核链表(移植完成)

linux内核链表设计的得十分巧妙,代码将其从内核代码总移植出来,可适用于应用程序软件。

2018-02-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除