lockf(1,1,0)
时间: 2023-06-08 10:07:41 浏览: 355
lockf(1,1,0) 是一个 Linux 中的系统函数,用于在文件描述符 1(即标准输出)上进行文件锁操作。第一个参数表示文件描述符,第二个参数表示锁定方式(1 表示写锁,0 表示解锁),第三个参数表示锁定字节数。在这里,lockf(1,1,0) 的作用是在标准输出上进行一次写锁操作。
相关问题
#include<stdio.h>main(){int p1,p2,i;while ((p1=fork())==-1);if(p1==0) {lockf(1,1,0);for(i=0;i<500;i++) printf("child %d\n",i);lockf(1,0,0);}else { while((p2=fork())==-1); if(p2==0){lockf(1,1,0) for(i=0;i<500;i++) printf("son %d\n",i); lockf(1,0,0) else{ lockf(1,1,0) for(i=0;i<500;i++) printf("daughter %d\n",i); lockf(1,0,0)}}}
这段代码是一个使用fork()函数创建进程的示例代码,它会创建三个进程:父进程和两个子进程。其中,父进程会创建两个子进程,而每个子进程会输出500次不同的字符串。
具体来说,当父进程运行到第6行时,会通过fork()函数创建一个子进程p1。如果创建成功,子进程p1会返回0,否则会返回-1。如果返回的是0,说明当前运行的是子进程p1,那么它会通过lockf()函数锁定标准输出流,然后循环500次输出字符串"child i",最后再解锁标准输出流。
如果返回的不是0,说明当前运行的是父进程,那么它会继续执行第8行代码,创建另一个子进程p2。这个过程与创建子进程p1的过程类似。
如果创建成功,子进程p2会返回0,否则会返回-1。如果返回的是0,说明当前运行的是子进程p2,那么它会通过lockf()函数锁定标准输出流,然后循环500次输出字符串"son i",最后再解锁标准输出流。
如果返回的不是0,说明当前运行的是父进程,那么它会继续执行第13行代码,输出字符串"daughter i"。同样地,它会通过lockf()函数锁定标准输出流,然后循环500次输出字符串"daughter i",最后再解锁标准输出流。
需要注意的是,这段代码存在一些语法错误,比如在第11行缺少了一个左括号,而在第13行和第15行缺少了一个右括号。为了让代码能够正常运行,需要将这些错误修正。
修改 程序,改为向文件中打印输出。再给三个进程加锁、解锁,其中lockf()的参数1改为*fp,如lockf(*fp,10),观察并分析出现的结果int main() { int p1,p2; int i =0; while( (p1=fork())==-1): if(p1==0){ lockf (1,1,0); for(t=0;1<10;1++){ Prtntf. ("daughter ydln”,t):1 lockf(1,1,0);} else{ while((p2=fork())==-1): 1f (p2==0){ lockf(1,1,°): for(t=0;tx10;t++){ PrtntfC"son sd in, t):3 lockf (1,1,0) }else{ lockf (1,1,0);
为了将输出结果写入文件中,我们需要将 printf 函数改为 fprintf 函数,并指定输出文件的文件指针。
另外,我们需要使用 fopen 函数打开文件,并以写入模式打开,然后将文件指针传递给 lockf 函数中。最后使用 fclose 函数关闭文件。
修改后的程序如下:
```c
#include <stdio.h>
#include <unistd.h>
int main() {
FILE *fp = fopen("output.txt", "w");
int p1, p2;
int t = 0;
while ((p1 = fork()) == -1)
;
if (p1 == 0) {
lockf(fileno(fp), F_LOCK, 0);
for (t = 0; t < 10; t++) {
fprintf(fp, "daughter ydln %d\n", t);
lockf(fileno(fp), F_ULOCK, 0);
lockf(fileno(fp), F_LOCK, 0);
}
} else {
while ((p2 = fork()) == -1)
;
if (p2 == 0) {
lockf(fileno(fp), F_LOCK, 0);
for (t = 0; t < 10; t++) {
fprintf(fp, "son sd in %d\n", t);
lockf(fileno(fp), F_ULOCK, 0);
lockf(fileno(fp), F_LOCK, 0);
}
} else {
lockf(fileno(fp), F_LOCK, 0);
for (t = 0; t < 10; t++) {
fprintf(fp, "father ftns %d\n", t);
lockf(fileno(fp), F_ULOCK, 0);
lockf(fileno(fp), F_LOCK, 0);
}
}
fclose(fp);
}
return 0;
}
```
在这个程序中,我们打开了一个名为 "output.txt" 的文件,并以写入模式打开。我们使用 fprintf 函数将输出结果写入文件中。在每次输出后,我们使用 lockf 函数对文件进行加锁,以确保多个进程不会同时写入文件,从而导致输出结果混乱。在每次加锁之后,我们使用 fprintf 函数输出结果,并使用 lockf 函数解锁文件。最后,我们使用 fclose 函数关闭文件。
需要注意的是,lockf 函数的第一个参数应该是文件指针所对应的文件描述符,而不是文件指针本身。因此,我们使用 fileno 函数获取文件指针对应的文件描述符。
在这个程序中,我们将 lockf 函数的第三个参数都设置为 0,表示对整个文件进行加锁。如果需要对文件的某个部分进行加锁,可以将第三个参数设置为需要加锁的字节数。
当运行这个程序时,我们会发现输出结果被写入了 "output.txt" 文件中,而不是直接输出到终端。同时,我们会发现每个进程的输出结果都被正确地互相隔离,不会混淆在一起。这是因为我们使用 lockf 函数对文件进行了加锁和解锁,确保了多个进程不会同时写入文件。
阅读全文