Linux进程的几种状态

1、TASK_RUNNING:(R)

进程当前正在运行,或者正在运行队列中等待调度。只有在该状态的进程才可能在CPU上运行,同一时刻可能有多个进程处于可执行状态。

2、TASK_INTERRUPTIBLE:(S)

进程处于睡眠状态,处于这个状态的进程因为等待某事件的发生(比如等待socket连接、等待信号量),而被挂起。当这些事件发生时,对应的等待队列中的一个或多个进程将被唤醒。一般情况下,进程列表中的绝大多数进程都处于TASK_INTERRUPTIBLE状态。进程可以被信号中断。接收到信号或被显式的唤醒呼叫唤醒之后,进程将转变为 TASK_RUNNING 状态。

3、......

vfork挂掉的一个问题

原文链接

有如下代码:

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

int glob = 10;

int main(void)

{

int var;

var = 88;

pid_t pid;

if ((pid = vfork()) < 0)

{

printf("vfork error");

exit(-1);

}else if (pid == 0)

{ /* 子进程 */

var++;

return 0;

}

printf("pid=%......

linux c如何计算文件大小

最近在翻apue,看到函数lseek时想到之前一个面试题,如何计算文件的大小,现将部分实现整理如下:

方法一标准库函数实现:

#include <stdio.h>

#include <string.h>

#include <errno.h>

int main(int argc,char *argv[])

{

FILE *fp;

if(argc < 2)

{

printf("Usage:%s <file>\n",argv[0]);

}

if((fp=fopen(argv[1],"r")) ==......

系统调用与标准IO

最近抽时间在同事推荐的一本某培训机构出的一本书,虽然我对这种机构不感冒,不过坦率的讲,书中所总结的大都是比较重要的。

C标准库中许多函数构建于系统调用之上。比如库函数fopen()就是利用系统调用open()来执行打开文件的实际操作。printf()函数就是利用系统调用write()来执行。让我们来验证上述观点。

验证上述观点前需要熟悉strace命令,strace常用来跟踪进程执行时的系统调用和所接收的信号。来自man手册的介绍:

In the simplest case strace runs the specified command until it exits. I......

XY问题

最近在朋友圈看到的一篇文章,深有体会,问问题也是一门学问,转载自coolshell,改正原文中存在的一个错误。

对于X-Y Problem的意思如下:

1)有人想解决问题X

2)他觉得Y可能是解决X问题的方法

3)但是他不知道Y应该怎么做

4)于是他去问别人Y应该怎么做?

简而言之,没有去问怎么解决问题X,而是去问解决方案Y应该怎么去实现和操作。于是乎:

1)热心的人们帮助并告诉这个人Y应该怎么搞,但是大家都觉得Y这个方案有点怪异。

2)在经过大量地讨论和浪费了大量的时间后,热心的人终于明白了原始的问题X是怎么一回事。

3)于是大家都发现,Y根本就不是用来解......

从一道面试题说起

如果有人问你,extern "C"的作用是什么?你会如何回答?

先说一段故事:C++创始人在编写C++的时候,C语言正盛行,他不得不让C++兼容C。C++最大的特性就是封装,继承,多态,重载。而这些特性恰恰是C语言所不具备的。至于多态,核心技术是通过虚函数表实现的,其实也就是指针。而对于重载,与C语言相比,其实就是编译方式不同而已: C++编译方式和C编译方式。对于函数调用,编译器只要知道函数的参数类型和返回值以及函数名就可以进行编译连接。extern “C”是让程序按照C的方式编译。我们先来看看C++和C两种编译方式对于究竟有何不同。

main.c

#includ......

[LeetCode C实现]647. Palindromic Substrings

Given a string, your task is to count how many palindromic substrings in this string.

The substrings with different start indexes or end indexes are counted as different substrings even they consist of same characters.

Example 1:

Input: "abc"

Output: 3

Explanation: Three palindr......

Linux中录制回放终端会话

利用script和scriptreplay命令,我们可以录制命令的次序以及时序,将相关数据记录在文本文件中。利用这些文件,其他人可以在终端上回放并查看命令的输出。

我们在ubuntu终端中输入如下命令:

script -t 2> timing.log -a output.session

然后接着输入一系列命令操作,等操作演示完之后输入exit,将timing.log 和output.session发送到另一台centos中,可以通过scriptreplay timing.log output.session来回放录制的演示操作。

最终效果:在左侧ubuntu中我们使用scr......

二维数组总结

在刷leetcode时有道关于二维数组的题目,由于工作中较少写这块代码,对部分基础理解不足,现将学习C程序设计语言一书中关于二维数组的内容进行总结。

书中以一个日期转换函数为被背景问题,针对闰年与非闰年,可以写出二维数组的形式:

static char daytab[2][13]={

{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};

关于上述数组有几点需要解释:

首先将数组元素声明为char类型,每月天数最大值在127以内,因此可以使用char类型。

第一个元素为0,是......

为用户编程:终端控制和信号

终端驱动程序的模式

以一个简短的例子作为开始:

/* rotate.c : map a->b, b->c, .. z->a

* purpose: useful for showing tty modes

*/

#include <stdio.h>

#include <ctype.h>

int main()

{

int c;

while ( ( c=getchar() ) != EOF ){

if ( c == 'z' )

c = 'a';

else if (islower(c))

c++;

pu......