UNIX系统编程2《笔记》

linux系统编程课堂笔记2(20121014)

一、文件、文件夹的操作:

删除文件,文件改名,文件权限修改:

删除文件:unlink.

文件夹的权限改变:chown;chmod

文件改名:chname:

创建文件夹:mkdir

删除文件夹:rmdir

tree.c:

1.局部变量在递归中少用,防止栈溢出;不要再递归中用结构体,也是防止栈溢出,如果要用结构体,先在外面定义,然后通过函数传参数的方式传递进去,这样无论递归多深,只有一个结构体,防止了栈溢出。

2.Stat结构体在stat函数中没有定义,没有分配空间,需要在外面定义通过传参的方式传递进去。但是struct dirent在函数内部已经定义了一个dirent的结构体,空间已经分配好,不需要在外面定义结构体,只需要定义一个指针接受即可。

3.在函数的编写过程中,尽量不要用exit();exit()是强行退出进程,一般情况下,函数是没有权限去结束进程的,一般不用,不符合代码逻辑,一个函数出问题,怎么会结束掉整个进程呢,所以尽量不用。

二、进程:

执行的单元:

后台执行:不占用终端的进程。

一个软件可以有多个进程,理论如,一个播放器既有解码播放,又有监视用户操作的进程;

1.进程的创建:

pid_t fork(void);

执行完后,子进程生成,刚开始创建的时候,子进程和父进程是一样的,唯一的差别是pid_t不同,父进程返回值是子进程的进程号,子进程返回0;从这点进行区别。执行状况,打开文件等都相同,也打开相同的文件,之前的代码都一样,执行状况也完全相同,下面的代码根据pid_t来进行区别执行,或者是exec进行修改。

父子进程有相同的代码,但是可以执行不同的代码。

2.获取进行号:

getpid():获取正在执行的进程号;

getppid():获取正在执行的进程的父进程的进程号。

3.孤儿进程:

例子程序里就有孤儿进程,如果不加wait(),可以就是孤儿进程。孤儿进程就是父进程先结束,子进程还没有执行结束。而wait(参数)解决了该情况,在父进程里加入wait(参数),会等待子进程结束后才会继续执行。一般forkwait成对出现,在父进程中调用。

wait();

waitpid();

4.system(); 

这个在正式代码中一般不用,在调试的时候用的很多。

system("ls -l -a"); //开一个子进程,加载shell环境,运行shell命令,此时,主进程处于挂起状态。执行完以后,会回到主进程,继续执行主进程的内容。一般很少在正式代码中使用system,因为system开销过大,但是调试代码时很好用

5.exec:六种变种。

可以用execl代替system,在当前进程下执行一个新的文件;

执行execl后,原进程的所有数据全部清空,变成新的程序,进程号沿用,进程继续。。如果exec调用失败,那么还继续执行原进程的代码

一般在子进程里使用。

6.进程间通信:

Int pipeint pipefd();

pipefd是文件描述符,需要close。这个注意。。

例如:

int pipefd[2] = {0};

//pipe创建两个文件描述符,并传递进数组里

//这两个文件描述符是一对管道

if (pipe(pipefd) < 0) {

perror("pipe");

goto err_pipe;

}

0 1 2 是标准输入输出和错误,从3开始分配,管道具体如下:

假设分配的是34,则从3写进去,然后可以从4读取出来。

当另一端没有数据,这端管道是空的,则挂起(特殊文件,例如STDIN_FILENO);当另一端涌进来数据,则这端的管道会将数据读进来。除非对方的数据源断开,就是另一端的管道关闭,会接受到0。这样子进程通讯结束。如果没有上图中的第三步,则

父子进程间通信:

步骤1.pipe

步骤2.在启动子进程fork

步骤3.子进程和父进程各自关掉想对应的一条通路,否则不好监控对方是否关闭。这样子管道不能用。子进程和父进程之间是单项通信。Fork后,要决定怎么通信,然后必须关闭掉其中一条通路。

-------------------------------------------------END--------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值