exit()和_exit() 区别:函数库中有缓冲I/O的操作,是printf,fopen,fwrite,fread等,使用这些函数都会在系统中产生数据缓冲区,读文件会把内容放在文件缓冲区,下次读可以直接从缓冲区读写。写文件也是写到文件缓冲区,等待一个/n和文件结束符EOF,才会将所有内容真正一次写入文件中。这会大大提高读写速度。而exit会检查缓冲区将文件缓冲区的内容写回文件,而_exit是直接关闭。一个进程在调用exit之后会留下一个僵尸进程。在以下情况下使用_exit(),将清理工作交给父进程 早子进程中调用exec失败后不曾调用exec的子进程
int main() { printf("Using exiting...\n"); printf("This is the content in buffer"); exit(0);//_exit(0) /*第一个结果为 两句话,第二个结果为一句话 }
wait()是特殊的waitpid() waitpid()等待参数pid特定的子进程退出,而wait等待任意一个子进程退出;二者一出来就会寻找已经变成僵尸进程的子进程,如果没有就等待或者结束 wait(NULL)返回子进程结束状态值,不关心设为NULL WEXITSTATUS(status)用来提取子进程的返回值,WIFEXITED(status)用来判断,当返回0时,进程不是正常返回,上个值没有意义
lockf(fd,功能选择,字数) fd是文件内容,功能选择为1时是上锁,0是解锁 字数:锁定和开锁的字节数,0是全文
信号通信
一个进程收到一个信号和一个处理器收到一个中断请求是相同的,信号是异步的,一个进程不必通过任何操作来等待信号的到达,信号是通信过程中唯一的异步通信机制,通知进程有哪些事情发生了
进程对信号进行3种可能的操作:忽略信号,捕捉信号(执行相应处理函数),执行默认操作。 由sigaction结构体和函数决定是哪个操作。发出信号的多个原因
信号中的kill函数:终止进程或向进程发送其他信号 kill(PID,信号)进程号多种多样可以群发 raise函数,向进程本身发送信号 alarm(时间)专门为SIFALRM信号制定,时钟定时信号
消息队列
ftok函数生成key,参数为现存文件和项目ID msgget函数 创建或打开的队列 参数为key和flag标志位 创建队列的两种方法 msgctl函数 对消息队列执行多种操作 msgsnd函数 将数据放到消息队列 msgrcv函数 将消息取出消息队列
Linux守护进程
创建子进程,退出父进程 在子进程中使用setsid函数摆脱从父进程那继承过来的会话期 进程组 控制终端 改变当前工作目录为根目录上 使用umask函数重设文件权限掩码 关闭文件描述符 可以fork两次,不是必须 害怕后期误操作打开终端,只有会话首进程会能打开终端