Linux 编程基础——文件操作(部分)与进程控制

1.文件操作

1.1 stat()函数`

#include <sys/stat.h>
int stat(const char *path,struct stat *buf)

参数说明:

  • path:文件路径
  • buf:缓冲区,用于接收获取到的文件属性

功能说明:
获取文件属性。文件的属性存储于incode中,因此该函数实际上是从incode结构体中获取文件信息。

返回值说明:
成功:返回0。
失败:返回-1,并设置

1.2 access()函数:

#include <unistd.h>
int access(const char *pathname,int mode)

参数说明:

  • pathname:文件名
  • mode:
    • R_OK:具备读的权限
    • W_OK:具备写的权限
    • X_OK:具备执行的权限
    • F_OK:测试文件是否存在

功能说明:
测试文件是否拥有某种权限

返回值说明:
返回0:调用成功,并且指定文件存在或具有某种权限。
返回-1:调用失败,或者文件不存在或不具备某种权限。

1.3 chmod()函数:

#include <sys/stat.h>
int chmod(const char *path,mode_t mode)

参数说明:

  • path:路径名
  • mode:传递修改后的权限

功能说明:
用于修改文件的权限。

返回值说明:
成功:返回0
失败:返回-1,并设置error的值

1.4 truncate()函数:

#include <sys/stat.h>
int truncate(const char *path,off_t length)

参数说明:

-path:路径名

  • length:文件大小

功能说明:
用于修改文件的大小,常用于扩展文件。

返回值说明:
成功:返回0
失败:返回-1,并设置error的值

2.进程控制

2.1创建进程

#include <unistd.h>
pid_t fork(void)

功能说明:
使用该函数创建进程,执行后,系统会创建一个与原进程近乎相同的进程,之后父子都继续往下执行。
图片为转载,转载自CSDN @Henrymale
调用fork()函数创建的进程为子进程,调用fork()函数的进程为父进程。

返回值说明:
成功:返回两个值,子进程创建成功后,原程序会被复制,就有了两个fork函数。父进程的fork函数会返回子进程的pid,子进程的fork函数会返回0。
失败:原程序不会被复制,父进程的fork()函数返回-1.
案例:使用fork()函数创建一个进程,进程创建成功之后使父进程与子进程分别执行不同的功能

test_fork.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
	pid_t tempPid;
	tempPid = fork();
	if(tempPid == -1){
		perror("fork error");
	}else if(tempPid > 0){//parent
		printf("parent process, pid = %d, ppid = %d\n", getpid(), getppid());
	}else{//child
		printf("child process, pid = %d, ppid = %d\n", getpid(), getppid());
	}//of if
	printf("......finish......");
	return 0;
}//of main

思考1:多次执行文件test_fork会发现这种情况:child process后输出的ppid不等于parent process的pid,而等于1,分析出现这种情况的原因。
原因:由于出现了父进程在子进程之前终止,导致紫禁城变成了孤儿进程,后面由init进程来接收,而init进程号为1.

2.2 创建多个进程:

对上面的代码进行修改,使用下列代码

int i;
for(i = 0; i < 2; i ++){
	tempPid = fork();
}//of for i

图片为转载
在循环的过程当中,除了父进程会创建之外,父进程的子进程在第二次循环的过程当中也会创建进程。因此循环n次所得到的进程个数并不是n个,而是2的n次方。

若想仅父进程可以创建新进程,可进行相应的判断:

test_fork2.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
	pid_t tempPid;
	int i;
	for(i = 0; i < 2; i ++){
		if((tempPid = fork()) == 0){
			break;
		}//of if
	}//of for i
	if(tempPid == -1){
		perror("fork error");
	}else if(tempPid > 0){//parent
		printf("parent process, pid = %d, ppid = %d\n", getpid(), getppid());
	}else{//child
		printf("I am child process = %d, pid = %d, ppid = %d\n", i + 1, getpid(), getppid());
	}//of if
	printf("......finish......");
	return 0;
}//of main

思考2:分析上述代码的输出结果,发现输出结果有以下问题:
1.子进程的编号并不是递增输出的
2.终端提示符后面仍然有子进程信息打印,而命令提示符在最后一行的开头闪烁
出现原因:
1.由于父子进程之间的优先级是一致的,cpu随机选择进行执行
2.终端也是进程,与创建的父子进程一起竞争资源,cpu在选择的时候进行随机选择导致。

2.3 控制进程的执行顺序:使用sleep()函数,暂缓程序执行

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(){
    pid_t tempPid;
    int i;
    for(i=0;i<5;i++){
        tempPid=fork();
        if(tempPid==0){
            break;
        }//of if
    }//of for i
    if(tempPid==-1){
        perror("fork error");
        exit(1);
    }else if(tempPid>0){//of parent
        sleep(5);
        printf("parent pid=%d\n",getpid());
    }else if(tempPid==0){//of child
        sleep(i);
        printf("I am child%d pid=%d\n",i+1,getpid());
    }//of if
    return 0;
}//of main

最终效果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值