
Linux系统编程
zhou jiabo
这个作者很懒,什么都没留下…
展开
-
获取已打开文件的fd
获取进程中已打开文件的文件描述符:1、运行测试代码:#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>int main(int argc, char const* argv[]){ int fd = open(argv[1], O_RDONLY); printf("pid原创 2021-05-28 18:10:42 · 1414 阅读 · 0 评论 -
进程间通信 - 管道
通信方式分类: ①位于同一台主机上的 ---- 管道、XSI-IPC 有亲缘关系 没有亲缘关系②位于不同主机上的 ---- socket管道①内核提供,单工②自同步机制(迁就比较慢的一方)③管道要凑齐读写两方才能进行操作④两个管道协同,可实现双工a. 匿名管道(磁盘看不到,有亲缘关系的进程间通信) pipe(); //默认pd[0]读端 [1]写端b. 命令管道(实际是一个p文件) mkfifo(); //创建命令管道,man 3 mkfifomkfifo xxx 命原创 2021-05-01 21:56:08 · 81 阅读 · 0 评论 -
守护进程与系统日志配合使用
守护进程某些服务需要一直在后台跑。守护进程一般是一个会话的Leader,也是一个进程组的Leader。一个session(会话)中存在多个进程,前台进程组,后台进程组。最多只有一个前台进程组,可以没有。只有前台进程组能使用标准输入输出。守护进程的特点:setsid();//创建一个会话,并设置进程组ID。只有子进程才能创建会话,调用方会成为新的会话的leader,会成为当前新的进程组的leader,并脱离控制终端。ps axj: 守护进程的tty为’?’,sid,pgid,pid相同。如果创原创 2021-05-01 21:39:30 · 274 阅读 · 0 评论 -
如何避免僵尸进程
引言:在服务器中,进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。一个子进程在终止或停止时,会向其父进程发送SIGCHLD信号。对于SIGCHLD信号,如果我们定义为:1.SIG_DFL:默认的处理方式是不理会这个信号,但是也不会丢弃子进程状态,所以如果不用wait,waitpid对其子进行进行状态信息回收,会产生僵尸进程。2.SIG_IGN:忽原创 2021-05-01 21:18:25 · 736 阅读 · 0 评论 -
进程基础
进程基础知识1、进程标识符pidpid_t (int16_t),有可能不够用 。命令ps, ps -axf**进程号是顺次向下使用。(与fd有区别)**获取当前进程的pid:getpid(); 获取父进程的pid:getppid();2、进程的产生 fork();①duplicating的,复制,拷贝,一模一样,连运行到的位置都相同②fork后父子进程的区别:fork的返回值不一样,pid不同,ppid也不同,未决信号(还没来得及去响应的信号)和文件锁不继承,资源利用量归零。③原创 2021-05-01 18:29:50 · 197 阅读 · 0 评论 -
fgetc、fgets用法 && 实现cp操作
fgetc函数原型:int fgetc(FILE *stream);为什么fgetc返回的是int而不是char?通过man fgetc查看其返回值:fgetc(), getc() and getchar() return the character read as an unsigned char cast to an int or EOF on end of file or error.返回时,unchar型会被转换为int,因为读到文件尾时需要返回的是EOF(-1), 如果为char型,-1原创 2021-05-01 16:59:54 · 794 阅读 · 0 评论 -
三大缓冲模式
缓冲区的作用:大多数情况下是好事,可以合并系统调用缓冲模式与刷新时机:行缓冲:遇到换行符\n时刷新,满了的时候刷新,强制刷新。例如:stdout(标准输出)全缓冲:满了的时候刷新,强制刷新。例如:文件无缓冲:如stderr,需要立即输出。int fflush(FILE *stream);强制刷新指定的stream,如果参数为NULL,则刷新所有打开的stream。了解:文件的缓冲模式是可以改的,setvbuf函数;一般不会用到。...原创 2021-05-01 16:48:37 · 572 阅读 · 0 评论 -
fseek、ftell、rewind用法
int fseek(FILE *stream, long offset, int whence);long ftell(FILE *stream);1、fseek,ftell能操作(定位)的文件最大容量为2G。fseeko能操作4G的文件,但它遵循POSIX,移植性不如fseek(遵循C99)2、fseek函数参数:whence有三个设置可选SEEK_SET, SEEK_CUR, SEEK_ENDoffset是在whence基础上的偏移,可正可负(正表示向后移动)。3、ftell返回当原创 2021-05-01 16:32:33 · 449 阅读 · 0 评论 -
fread、fwrite、fprintf用法
一、fread/fwritesize_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);从stream中读nmemb个对象,每个对象size大小,读到ptr中;返回值:成功读取的对象个数,为0时读取完毕。比较fread(buf,1,10,pf);与fread(buf,10,1,pf);有下面两个情景:①数量足够多 ②只有5个字节fread(buf,1,10,pf)① 返回10 成功读到10个字节② 返回5 成功读到5个字原创 2021-05-01 16:20:03 · 380 阅读 · 0 评论