1:linux下创建一个文件 int creat(const char *filename ,mode_t mode );
打开一个文件 int open(const *pathname,int flag,mode_t mode );
常见的打开方式:o_creat, 创建一个文件,
2:struct tm
{
int tm_sec; /* Seconds. [0-60] (1 leap second) */
int tm_min; /* Minutes. [0-59] */
int tm_hour; /* Hours. [0-23] */
int tm_mday; /* Day. [1-31] */
int tm_mon; /* Month. [0-11] */
int tm_year; /* Year - 1900. */
int tm_wday; /* Day of week. [0-6] */
int tm_yday; /* Days in year.[0-365] */
int tm_isdst; /* DST. [-1/0/1]*/
}
3: 计算时间消耗,常用于算法分析-----int gettimeofday(struct time *tv,struct timezone *tz)其参数tv是保存获取时间结果的结构体,参数tz用于保存时区结果(若不使用则传入NULL即可)。
struct timeval
{
int tv_sec ; // 秒数
int tv_usec;//微妙数
}
4: 睡眠函数sleep(unsigned int senonds) 睡眠多少秒。 usleep(unsigned long usec) 睡眠多少微妙。
5: 进程理论基础:
狭义定义:进程就是程序的执行过程。
(1: 进程的特点: !动态性!, 并发性,独立性,异步性(两个进程运行无影响)。
(2: 进程ID:PID也就是一串数字为进程的唯一标识。
(3: PPID:父进程的ID,
(4:启动进程的用户ID: UID
(5:操作系统中只允许一个进程访问的资源被称为临界资源。访问临界资源的进程中的代码叫临界区。
(6:进程的调度:按照一定的算法,从一组运行的进程中选出一个来占有CPU运行
(7:调度方式:抢占式,非抢占式。
(8:算法:先来先服务,短进程优先。
(9:结构特征:进程由程序、数据和进程控制块三部分组成。
(10:死锁:多个进程因竞争资源而形成一种僵局,若无外力作用,这些进程都将永远不能再向前推进。
6: 进程程序设计:两个头文件: sys/types.h 和unistd.h pid_t getpid(void) 获取现在进行 进程的ID。
7: pid_t fork(void); 从现在的进程中创建一个新的进程。且这两个进程为父子关系。
8: 子进程被创建后会继承父进程的代码。并不会和父进程共享堆栈空间,也就是不会据称更改父进程中的变量的值(fork()中),子进程不会继承父进程的文件锁定和未处理的信号。
fork()子进程拷贝父进程的数据段
vfork()子进程共享父进程的数据段。
fork () 父子进程的执行次序不确定。
vfork() 子进程先执行,父进程后执行。
9: exec函数组 启动一个新程序,替换原有的进程,因此现在的PID不会改变。
execl( const char *path /*给出完整的程序执行路径*/ ,const char arg,................ //给出执行参数,并以NULL 结尾*/)
10:execlp(const char *file ,const arg..........) 初第一个同上。其路径为环境变量 PATH的值。
11:pid _t wait(int *status) 等待子进程退出。
12: POSIX 表示可移植操作系统接口(Portable Operating System Interface ,缩写为 POSIX 是为了读音更像 UNIX)。电气和电子工程师协会(Institute of Electrical and Electronics Engineers,IEEE)最初开发 POSIX 标准,是为了提高 UNIX 环境下应用程序的可移植性。
13:重要!{
linux进程间通信方式:
1 : 管道(pipe) 有名管道(FIFO);
2:信号 (signal)
3 : 消息队列
4: 共享内存
5:信号量
6: 套接字(socket)
}
14:管道: 单向,先进先出,数据被一个进程读出后,将从被管道中删除。其它进程不会在被读到。
int pipe(int filedis [2]) 创建一个无名管道,filedis[0] 用于读管道,filedisp[1]用于写管道。
int pclose(FIFE *stream);stream 为popen(const char *)所返回的文件指针。
在fork()前调用pipe(),否则子进程不会继承文件描述符。 POSIX 表示可移植操作系统接口(Portable Operating System Interface ,缩写为 POSIX 是为了读音更像 UNIX)。电气和电子工程师协会(Institute of Electrical and Electronics Engineers,IEEE)最初开发 POSIX 标准,是为了提高 UNIX 环境下应用程序的可移植性
15: 有名管道 不相关的进程都可以访问,而无名管道只能父子进程可以访问。
mkfifo(const *pathname,mode_t mode)创建一个有名管道,
16: unsigned int alarm(unsigned int seconds) 设置的时间到了之后给进程本身发送一个时钟信号。
int pause(void) 使进程等待,只有执行了一个信号处理函数后,挂起才结束。
17:void (*signal(int signo,void (*func)(int)))(int)
typedef void (*sighandler_t) (int)
sighandler_t signal(int signum,sighandler_t handler))
func 可能的值:
SIG_IGN:忽略此信号
SIGDFL:
这个符号表示恢复系统对信号的默认处理。18:下面的情况可以产生Signal:
1. 按下CTRL+C产生SIGINT 2. 硬件中断 ,如除0,非法内存访问(SIGSEV)等等 3. Kill函数可以对进程发送Signal 4. Kill命令。实际上是对Kill函数的一个包装5. 软件中断。如当Alarm Clock超时(SIGURG),当Reader中止之后又向管 道写数据(SIGPIPE),等等
19:共享内存的实现:
1创建共享内存: int shmget(key_t key, size_t size, int shmflg);
key标识共享内存的键值: 0/IPC_PRIVATE。 当key的取值为IPC_PRIVATE,则函数shmget()将创建一块新的共享内存;如果key的取值为0,而参数shmflg中设置了IPC_PRIVATE这个标志,则同样将创建一块新的共享内存。
2:char *shmat( int shmid , void *shmaddr , int shmflag );shmat()是用来允许本进程访问一块共享内存的函数。 int shmid是那块共享内存的ID。 char *shmaddr是共享内存的起始地址 int shmflag是本进程对该内存的操作模式。如果是SHM_RDONLY的话,就是只读模式。其它的是读写模式
成功时,这个函数返回共享内存的起始地址。失败时返回-1
当*shmaddr 为0则为有系统分配一个内存块。
20:int shmdt(char *shmaddr) 当一个进程不在需要共享内存的时候,需要其把他璁进程地址空间中脱离。
21:消息队列:实质就是好多消息构建成的链表
1:posix消息队列:
2:系统V消息队列:
每个消息队列都有一个键值, key_t ftok(char *pathname, char proj)
proj 项目名,不为0即可。
22: 线程:
1:相对于进程线程“节俭“,线程创建不需要新的地址空间。
23:线程清除: pthread_cleanup_push(void (* Rtd)(void*),void *arg);Rtn 清除