#include <stdio.h> #include <unistd.h> #include <fcntl.h> int main() { int i, j; pid_t p1, p2; int fd; fd = open("lockfile", O_CREAT | O_RDWR, 0666); if (fd == -1) { printf("Open file error\n"); return 1; } for (i = 0; i < 10; i++) { p1 = fork(); if (p1 == -1) { printf("Fork error\n"); return 1; } else if (p1 == 0) { for (j = 0; j < 10; j++) { lockf(fd, F_LOCK, 0); if (getpid() % 2 == 0) { printf("daughter %d\n", j); } else { printf("son %d\n", j); } lockf(fd, F_ULOCK, 0); } return 0; } else { p2 = fork(); if (p2 == -1) { printf("Fork error\n"); return 1; } else if (p2 == 0) { for (j = 0; j < 10; j++) { lockf(fd, F_LOCK, 0); if (getpid() % 2 == 0) { printf("daughter %d\n", j); } else { printf("son %d\n", j); } lockf(fd, F_ULOCK, 0); } return 0; } else { for (j = 0; j < 10; j++) { lockf(fd, F_LOCK, 0); printf("parent %d\n", j); lockf(fd, F_ULOCK, 0); } } } } close(fd); return 0; } 改为向文件中打印输出,再给三个进程加锁、解锁,其中lockf()的参数1改为*fp,如lockf(*fp,1,0),观察并分析出现的结果。
时间: 2024-02-14 18:14:08 浏览: 124
首先,需要将代码中的输出语句改为向文件中打印输出。具体做法是使用dup2()函数将文件描述符fd复制到标准输出(文件描述符为1)。
修改后的代码如下:
```c
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{
int i, j;
pid_t p1, p2;
int fd;
FILE *fp;
fp = fopen("lockfile", "w+");
if (fp == NULL)
{
printf("Open file error\n");
return 1;
}
dup2(fileno(fp), STDOUT_FILENO);
for (i = 0; i < 10; i++)
{
p1 = fork();
if (p1 == -1)
{
printf("Fork error\n");
return 1;
}
else if (p1 == 0)
{
for (j = 0; j < 10; j++)
{
flock(fileno(fp), LOCK_EX);
if (getpid() % 2 == 0)
{
printf("daughter %d\n", j);
}
else
{
printf("son %d\n", j);
}
flock(fileno(fp), LOCK_UN);
}
return 0;
}
else
{
p2 = fork();
if (p2 == -1)
{
printf("Fork error\n");
return 1;
}
else if (p2 == 0)
{
for (j = 0; j < 10; j++)
{
flock(fileno(fp), LOCK_EX);
if (getpid() % 2 == 0)
{
printf("daughter %d\n", j);
}
else
{
printf("son %d\n", j);
}
flock(fileno(fp), LOCK_UN);
}
return 0;
}
else
{
for (j = 0; j < 10; j++)
{
flock(fileno(fp), LOCK_EX);
printf("parent %d\n", j);
flock(fileno(fp), LOCK_UN);
}
}
}
}
fclose(fp);
return 0;
}
```
在每个子进程的循环中,加入锁和解锁操作,使用flock()函数实现。其中,参数1为文件描述符,参数2为要进行的操作(LOCK_EX表示获取独占锁,LOCK_UN表示解锁),参数3为锁的类型(0表示阻塞锁)。
运行代码后,可以发现输出结果被写入到了文件lockfile中。由于加了锁,每个进程的输出在一段时间内是互斥的,没有交叉出现。但是,由于没有设置锁的范围,也就是说,每个进程都在对整个文件进行加锁和解锁操作,因此会出现死锁的情况,进程在等待锁的释放而无法继续执行的情况。
阅读全文