Notes on Advanced Unix Environme

2016-05-14  本文已影响0人  24K纯彬

3. File IO

4. FILE & DIR

struct stat {
    mode_t st_mode; /* file type & mode */
    ino_t st_ino; /* i-node number */
    dev_t st_dev; /* device number */
    dev_t st_rdev; /* device number for special files */
    nlink_t st_nlink; /*number of links */
    uid_t st_uid; /* user ID of owner */
    gid_t st_gid; /* group ID of owner */
    off_t st_size; /* size in bytes */
    time_t st_atime; /* time of last access */
    time_t st_mtime; /* time of last modification */
    time_t st_ctime; /* time of last file status change */
    blksize_t st_blksize; /* best I/O block size */
    blkcnt_t st_blocks; /* number of disk blocks allocated */
};

5. Std IO

6. System Data File & Info

7. Process Enviroment

8. 进程控制

// system实现
#include <stdio.h>
//#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>

static void error_exit(char *msg) {
    perror(msg);
    //exit(1);
}

static int system(const char *cmd_string)
{
    pid_t pid;
    int status;
    if (cmd_string == NULL) return 1;
    if ((pid = fork()) < 0) {
        status = -1;
    }
    else if (pid == 0) {
        execl("/bin/sh", "sh", "-c", cmd_string, (char *)0);
        _exit(127);
    }
    else {
        while(waitpid(pid, &status, 0) < 0) {
            if (errno != EINTR) {
                status = -1;
                break;
            }
        }
    }

    return status;
}

int main() {
    int status;
    if ((status = system("date")) < 0) error_exit("data error");

    return 0;
}

9. 进程关系

make all > make.out &
[1]     1475
作业号  进程ID

10. 信号

// 调用fork两次,避免僵尸进程
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

void error_exit(char *msg) {
    perror(msg);
    exit(1);
}

int main() 
{
    pid_t pid;
    if (pid = fork() < 0) {
        error_exit("fork error");
    }
    else if (pid == 0) {
        if ((pid = fork()) < 0) error_exit("fork error");
        else if (pid > 0) exit(0);

        sleep(2);
        printf("second child, pid %d ppid %d\n", getpid(), getppid());
        exit(0);
    }
    if (waitpid(pid, NULL, 0) != pid) {
        error_exit("waitpid error");
    }
    return 0;
}

11. 线程

一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁。读写锁非常适用于对数据结构读的次数远远大于写的情况。

利用线程间共享的全局变量进行同步,主要包括两个动作,一个线 程等待条件白能量的条件成立而挂起,另一个线程使条件成立。为了防止竞争,条件变量总是和一个互斥锁结合在一起。

pthread_cond_t cond;
pthread_cond_init
pthread_cond_destroy
pthread_cond_wait
pthread_cond_signal
pthread_cond_broadcast

12. 线程控制

13. 守护进程

守护进程也称精灵进程(daemon)是生存期较长的一种进程。它们常常在系统自举时启动,仅在系统关闭时才终止。因为它们没有控制终端,所以说它们是在后台运行的。Unix系统中有很多守护进程,它们执行日常事务活动

14. 高级IO

先构造一张有关描述符的列表,然后调用一个函数,直到这些描述符中的一个已经准备好进行IO时,该函数才返回

15. 进程间通信

int pipe(int fid[2]) // 返回两个设备Id,0为读,1为写,通过read,write系统调用进行读写

16. 网络IPC: 套接字

17. 高级进程间通信

上一篇下一篇

猜你喜欢

热点阅读