linux编程.2

文件I/O(PART)与进程控制(PART)

part : 文件操作


||stat()函数

功能:用于获取文件的属性;
参数说明:

path:文件路径;
buf:接收获取到的文件属性;文件属性存储在inode中,函数从inode结构体中获取文件信息。

案例:使用stat()函数获取文件属性,并且输出文件的大小

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
int main()
{
	struct stat sbuf;
	int ret = 2;
	ret = stat("a.out", &sbuf);
	if (ret == -1){
		perror("stat error:");
		exit(1);
	}
	printf("len=%ld\n", sbuf.st_size);
	return 0;
}

输出:len = 7401

||access()函数

功能:用于测试文件是否拥有某种权限;
参数说明:

pathname:文件名;
mode:取值有4个:R_OK, W_OK, X_OK, F_OK;前面3个是测试文件是否有读、写、执行权限,最后一个测试文件是否存在。
返回值说明:

成功:0,表示文件存在或具有某种权限。
不成功:-1并设置errno

||chmod()函数

功能:用于修改文件的访问权限;
参数说明:

path:路径名;
mode:传递修改后的权限。
返回值说明:

成功:0,表示文件存在或具有某种权限;
不成功:-1并设置errno。

||truncate()函数

功能:用于修改文件大小,常用于扩展文件,其功能与lseek函数类似;
参数说明:

path:路径名;
length:设置文件大小。
返回值说明:

成功:0;
不成功:-1并设置errno。

||link()

part  : 进程控制【fork()】

||fork()函数

功能:创建进程;函数执行后,系统会创建一个与原进程几乎相同的进程,之后父子进程都继续执行,如图所示:

返回值说明:

成功:返回两个值,子进程创建成功后,原程序会被复制,就有了两个fork函数。父进程的fork函数会返回子进程的pid,子进程的fork函数会返回0.
不成功:若子进程创建失败,原程序不会复制,父进程的fork函数返回-1。

||创建单个进程

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
	pid_t pid;
	pid = fork();							//调用fork()函数创建子进程
	if (pid == -1)							//创建失败
	{
		perror("fork error");
		exit(1);							//退出进程,指定返回值1
	}
	else if (pid > 0)						//父进程
	{
		printf("parent process,pid=%d,ppid=%d\n", getpid(), getppid());
	}
	else if (pid == 0)						//子进程
	{
		printf("child process,pid=%d,ppid=%d\n", getpid(), getppid());
	}
	printf("........finish..........\n");
	return 0;
}

由于父进程for循环会出现4个进程,极大浪费cpu,所以此方法创建多个进程会,cpu的负担会出现直指数级增长。

优化进程创建||创建多个进程

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

int main()
{
	pid_t pid;
	int i;
	for (i = 0; i<5; i++){				//循环创建进程
		if ((pid = fork()) == 0)		//若当前进程为子进程,便跳出循环
			break;
	}
	if (pid == -1){
		perror("fork error");
		exit(1);
	}
	else if (pid>0){					//父进程
		printf("parent process:pid=%d\n", getpid());
	}
	else if (pid == 0){					//子进程
		printf("I am child=%d,pid=%d\n", i + 1, getpid());
	}
	return 0;
}

if语句判断当前进程不是父进程则跳出循环,这样优化下创建多个进程cpu的运算就是一次函数的线性增长。然而又会出现新的问题。

输出结果为

 可见创建的子进程id是乱序的,也就是说,子进程创建出来由于优先级和父进程一样,会和父进程竞争cpu,这不是个优解。

创建多个进程优化版||加入sleep()

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

int main()
{
	pid_t pid;
	int i;
	for (i = 0; i<5; i++){				//循环创建进程
		if ((pid = fork()) == 0)		//若当前进程为子进程,便跳出循环
			break;
	}
	if (pid == -1){
		perror("fork error");
		exit(1);
	}
	else if (pid>0){
          					//父进程
                sleep(5);
		printf("parent process:pid=%d\n", getpid());
	}
	else if (pid == 0){					//子进程
                sleep(i);
		printf("I am child=%d,pid=%d\n", i + 1, getpid());
	}
	return 0;
}

如此,实现进程创建的合理有序,不会对cpu造成额外负担,over!!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_57872164

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值