Unix环境高级编程
LevinLin
本博客现只用于学习用,可能会转载他人的知识,若有涉及到您的版权问题,请与我联系。
> 飛雪迎春到﹐風雨送春歸
> 已是寒崖百丈冰﹐尤有花枝俏
> 俏也不爭春﹐只把春來報
> 待得山花爛漫時﹐他在叢中笑
展开
-
深入fork
#include #include int main(void){ int i = 0; pid_t pid; printf("share ostream...."); for (i = 0; i <2; i++) { if ((pid = fork()) < 0) { printf("forkerror\n"); }转载 2012-06-18 10:39:51 · 673 阅读 · 0 评论 -
rename() 解说
#include int rename(const char *oldpath, const char *newpath);//重命名(1) 如果oldname为一个文件:如果newname已存在,而且是一个目录,则不能重命名。 如果newname已存在,而且是一个文件,则先将newname文件先删除,然后将oldname更名为newname。对oldname原创 2012-07-01 15:58:35 · 965 阅读 · 0 评论 -
exit() abort() 区别
exit()函数结束程序,返回一个值给操作系统,告知程序的最后状态。在调用exit()函数之后,控制权会移交给操作系统。 在结束程序之前,exit()函数会调用之前使用atexit()注册过的所有函数,按照LIFO次序调用,关闭所有打开的文件,删除tmpfile()函数建立的所有临时文件。 abort()函数会发出一个SIGABRT信号来终止程序的执行。不会调用之前用atexit()函数注册原创 2012-07-27 17:16:16 · 1308 阅读 · 0 评论 -
undefined reference to 'pthread_create'
pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a。所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数建立fork处理程序时,需要链接该库。问题解决如下:在编译中要加 -lpthread参数gcc -o pthread pthread.c -lpthread 如果使用eclipse,原创 2012-07-29 16:41:55 · 426 阅读 · 0 评论 -
pthread_cleanup_push() pthread_cleanup_pop()
void pthread_cleanup_push(void (*rtn)(void *), void *arg);注册一个线程终止时的清理函数 (类似atexit),后注册的先执行。void pthread_cleanup_pop(int execute); 解除注册最近一个注册的线程清理函数,即线程清理函数使用类似栈的压 (push)、弹(pop)方式进行注册和解除;参数 execute原创 2012-07-29 21:27:32 · 726 阅读 · 0 评论 -
perror() strerror() _strerror()
定义函数 void perror(const char *s); perror ("open_port");函数说明 perror ( )用 来 将 上 一 个 函 数 发 生 错 误 的 原 因 输 出 到 标 准 设备 (stderr) 。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno 的值来决定要输出的字符串。 在库函数中有原创 2012-07-27 13:55:04 · 566 阅读 · 0 评论 -
时间相关 time() ctime time_t localtime() gettimeofday
1)求 时间差(精确到微秒) int gettimeofday (struct timeval *__restrict __tv,__timezone_ptr_t __tz);#include #include intmain(void){ int i=0; struct timeval tv,tv2; gettimeofday(&tv, NULL); for (i =原创 2012-07-02 11:23:10 · 2843 阅读 · 0 评论 -
exit() _exit()
图 C程序的启动与终止区别:_exit()函数:直接使进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;exit()函 数则在这些基础上作了一些包装,在执行退出之前加了若干道工序。exit()函数与_exit()函数最大的区别就在于 exit()函数在调用 exit 系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件。#includemain()原创 2012-07-16 16:44:50 · 10159 阅读 · 0 评论 -
socket编程中的connect
#include int connect(int sockfd,const struct sockadd *addr,socklen_t len)在connect中指定的地址是想与之通信的服务器地址。如果sockfd没有绑定到一个地址,connect会给调用者绑定一个默认地址。在UDP socket编程中,也可使用connect ,这样,就可直接write来发送数据,而不用sendto原创 2012-10-03 22:16:37 · 898 阅读 · 0 评论 -
sleep的可靠实现(APUE)
sleep使进程一直挂起,直到满足一下两个条件之一:1、睡眠时间到时;2、调用进程捕捉到一个信号,并从该信号处理函数返回;#include "apue.h"#include static voidsig_alrm(int signo){}unsigned intsleep(unsigned int nsecs){ struct sigaction newact,原创 2013-08-31 15:52:05 · 1043 阅读 · 0 评论 -
如果依赖的库文件是由低版本gcc编译的怎么办
除了安装低版本的gcc外。可以在/usr/lib中添加对应的libstdc++.so.5试试。有时候它会自动创建libstdc++.so.6文件,所以在make之前要保证libstdc++.so.6没有在/usr/lib里。PS:使用ldconfig会自动创建libstdc++.so.6libstdc++.so.5下载地址:http://ishare.iask.sina.com.c原创 2012-07-06 10:13:57 · 1292 阅读 · 0 评论 -
信号的未决 阻塞
信号的“未决”是一种状态,指的是从信号的产生到信号被处理前的这一段时间;可以通过 int sigpending (sigset_t *set) 和 int sigismember (const sigset_t *set, int signum) 查看某个信号是未决的。 信号的“阻塞”是一个开关动作,指的是阻止信号被处理,但不是阻止信号产生。 信号的阻塞就是让系统暂时保留信号原创 2012-07-26 16:08:43 · 695 阅读 · 0 评论 -
口令文件 getpwent()
#include #include struct passwd *getpwuid(uid_t uid);struct passwd *getpwnam(const char *name); #include #include #include #include struct passwd * getpwnam(const char *name){ struct原创 2012-07-03 17:28:45 · 646 阅读 · 0 评论 -
字符串转时间(time_t)
#include #include /** * str为日期字符串 * formatStr 为时间对应的格式, * 如2012-07-04 15:33:52对应的格式为%d-%d-%d %d:%d:%d */time_t string2time(const char * str,const char * formatStr){ s原创 2012-07-04 15:40:41 · 4407 阅读 · 0 评论 -
非局部跳转函数 setjmp 和 longjmp
1. 非局部跳转函数 - setjmp 和 longjmp 函数 非局部指的是,这不是由普通C语言goto语句在一个函数内实施的跳转,而是在栈上跳过若干调用帧, 返回到当前函数调用路径上的某一个函数中。(简单点基本这样说:goto 语句用于同一个函数内跳转, 而 setjmp 和 longjmp的组合,不但可以实现函数内跳转,还可以实现函数间跳转) 特别注转载 2012-07-13 17:08:25 · 684 阅读 · 0 评论 -
创建临时文件 tmpnam tmpfile tempnam mkstemp unlink
推荐使用 tmpfile mkstemp#include #include #include #include intmain(void){ FILE *pfile,*pfile2; int fileSize, readSize; char * fileBuff = NULL; char buff[128] = { 0 };/*****原创 2012-07-03 15:51:39 · 2255 阅读 · 0 评论 -
fork vfork
vfork用于创建一个新进程,而该新进程的目的是exec一个新程序。vfork与fork一样都创建一个子进程,但是它并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec(或exit),于是也就不会存访该地址空间。不过在子进程调用exec或exit之前,它在父进程的空间中运行。这种工作方式在某些UNIX的页式虚存实现中提高了效率(与上节中提及的,在fork之后跟随exec,并采用在原创 2012-07-16 15:26:35 · 665 阅读 · 0 评论 -
pthread 多线程编程
1、概述多线程程序作为一种多任务、并发的工作方式,有以下的优点: 1) 提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。 2) 使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目转载 2012-08-02 14:52:51 · 1117 阅读 · 0 评论 -
dup 与 dup2
1. 文件描述符在内核中数据结构 一个进程在此存在期间,会有一些文件被打开,从而会返回一些文件描述符,从shell中运行一个进程,默认会有3个文件描述符存在(0、1、2), 0与进程的标准输入相关联,1与进程的标准输出相关联,2与进程的标准错误输出相关联,一个进程当前有哪些打开的文件描述符可以通过/proc/进程ID/fd目录查看。 下图可以清楚的说明问题: 进程转载 2012-06-14 15:27:02 · 6578 阅读 · 0 评论 -
Unix系统信号
SignalDescriptionSIGABRT由调用abort函数产生,进程非正常退出SIGALRM用alarm函数设置的 timer超时或setitimer函数设置的interval timer超时SIGBUS某种特定的硬件异常,通常由内存访问引起SIGCANCEL由Solaris Thread Library内部使用,通常不转载 2012-07-21 17:28:53 · 5966 阅读 · 0 评论 -
可重入和不可重入
这种情况出现在多任务系统当中,在任务执行期间捕捉到信号并对其进行处理时,进程正在执行的指令序列就被信号处理程序临时中断。如果从信号处理程序返回,则继续执行进程断点处的正常指令序列,从重新恢复到断点重新执行的过程中,函数所依赖的环境没有发生改变,就说这个函数是可重入的,反之就是不可重入的。众所周知,在进程中断期间,系统会保存和恢复进程的上下文,然而恢复的上下文仅限于返回地址,cpu寄存器等之类的转载 2012-07-25 16:21:56 · 907 阅读 · 0 评论 -
僵尸进程
在UNIX术语中,一个已经终止、但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息、释放它仍占用的资源)的进程被称为僵尸进程(zombie)。僵尸进程的避免:一,让父进程比子进程先结束,让init进程来领养子进程。比如可以fork 2次:A进程 fork出B子进程,B子进程再fork出C子进程,再杀掉B子进程。这样C子进程就由init进程领养了。 一个由init进程领养的原创 2012-07-17 10:47:27 · 825 阅读 · 0 评论