在C语言中,如果一些函数被频繁的调用,不断地用函数入栈,即函数栈,则会造成栈空间或者栈内存的大量消耗,为了解决这个问题,特别的引入了inline关键字,表示为内联函数。
popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。参数type可使用“r”代表读取,“w”代表写入。依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。随后进程便可利用此文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中。此外,所有使用文件指针(FILE*)操作的函数也都可以使用,除了fclose()以外。
一、gets() 函数详解
gets()函数用来从 标准输入设备(键盘)读取字符串直到 回车结束,但回车符('\n')不属于这个字符串。
调用格式为:
gets(str);
其中str为字符串变量(字符串数组名或字符串指针)。
一、fork入门知识 一个进程,包括代码、数据和分配给进程的资源。fork() 函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
“一切皆Socket!”
话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket。
——有感于实际编程和开源项目研究。
PHP_FE(array_max,NULL) 宏替换后:
// zend函数入口 const zend_function_entry helloworld_functions[] = { // PHP_FE(array_max,NULL) // 此处和下面写法效果相等 { "array_max", zif_array_max, NULL, (zend_uint)(sizeof(NULL) / sizeof(struct _zend_arg_info) - 1), 0 }, PHP_FE_END /* Must be the last line in helloworld_functions[] */ };
select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。
一、puts() 函数详解
puts()函数用来向 标准输出设备 (屏幕)写字符串并换行,调用格式为:
puts(s);
其中s为字符串变量(字符串数组名或字符串指针)。
malloc与calloc用来动态分配内存空间,而realloc则是对给定的指针所指向的内存空间进行扩大或者缩小。
若子进程先于父进程结束时,父进程调用wait()函数和不调用wait()函数会产生两种不同的结果:
--> 如果父进程没有调用wait()和waitpid()函数,子进程就会进入僵死状态。
--> 如果父进程调用了wait()和waitpid()函数,就不会使子进程变为僵尸进程。
这是为什么呢?现在我们来深入学习wait()函数和waitpid()函数。