在linux内核中,fork函数用于创建进程
系统调用格式:
pid=fork()
fork()返回值的意义:
0 在子进程中,pid变量保存的fork()返回值为0,表示当前进程是子进程。
当大于0 在父进程中,pid变量保存的fork()返回值为子进程的id值(进程唯一标识符)
-1 创建失败
lockf函数用于对进程进行上锁和解锁,这就相当于PV操作,对共有资源进行限制。
参数定义
int lockf(files,function,size)
int files,function;
long size;
其中files是文件描述符,function是锁定和解锁,1表示锁定,0表示解锁,size是锁定或解锁的字节数,若用0,表示从文件的当前位置到文件尾。
while((pid1=fork()==-1);
这句话的意思是当进程创建失败的时候,我们知道fork()返回值为-1代表创建失败,我们继续进行创建,直到进程创建成功。
lockf(fd[1],1,0)
这句话就意味着在向fd[1]这个位置输入字符前对它进行锁定
与此相对应的
lockf(fd[1],0,0)
这句话意味着解锁。
#include<unistd.h>
#include<signal.h>
#include<stdio.h>
int pid1,pid2;
main()
{
int fd[2];
char buf_out[100],buf_in[100];
pipe(fd);
while((pid1=fork())==-1);
if(pid1==0)
{
lockf(fd[1],1,0);
strcpy(buf_out,"child P1 process is sending message!");
write(fd[1],buf_out,50);
sleep(5);
lockf(fd[1],0,0);
exit(0);
}
else
{
while((pid2=fork())==-1);
if(pid2==0)
{
lockf(fd[1],1,0);
sprintf(buf_out,"child%d process is sending message1",getpid());
write(fd[1],buf_out,50);
sleep(5);
lockf(fd[1],0,0);
exit(0);
}
else
{
wait(0);
read(fd[0],buf_in,50);
printf("%s\n",buf_in);
wait(0);
read(fd[0],buf_in,50);
printf("%s\n",buf_in);
exit(0);
}
}
}
~
本文介绍了Linux内核中的fork函数用于创建进程,并详细解释了其返回值的含义。同时,文章探讨了lockf函数在进程同步中的作用,将其比喻为PV操作,用于对共享资源的访问进行控制。通过示例展示了如何使用lockf进行文件锁定和解锁。文中还提到了一个错误处理策略,即在进程创建失败时,通过循环确保进程最终能成功创建。

1506

被折叠的 条评论
为什么被折叠?



