jelasin 的学生作业:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ITERATIONS 10
void write_time_to_file(FILE *file)
{
time_t rawtime;
struct tm *timeinfo;
char buffer[80];
time(&rawtime);
timeinfo = localtime(&rawtime);
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", timeinfo);
fprintf(file, "%s", buffer);
fflush(file);
}
int main()
{
struct sigaction sa;
sa.sa_handler = SIG_IGN;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_NOCLDWAIT;
sigaction(SIGCHLD, &sa, NULL);
FILE *file = fopen("output.txt", "w");
if (file == NULL)
{
perror("fopen");
exit(EXIT_FAILURE);
}
sem_t *sem_parent = sem_open("/sem_parent", O_CREAT | O_EXCL, 0644, 1);
sem_t *sem_child = sem_open("/sem_child", O_CREAT | O_EXCL, 0644, 0);
if (sem_parent == SEM_FAILED || sem_child == SEM_FAILED)
{
fprintf(stderr, "sem_open failed\n");
if (errno == EEXIST)
{
fprintf(stderr, "Semaphore already exists\n");
if (sem_unlink("/sem_parent") < 0)
{
perror("sem_unlink");
exit(EXIT_FAILURE);
}
if (sem_unlink("/sem_child") < 0)
{
perror("sem_unlink");
exit(EXIT_FAILURE);
}
sem_t *sem_parent = sem_open("/sem_parent", O_CREAT, 0644);
sem_t *sem_child = sem_open("/sem_child", O_CREAT, 0644);
if (sem_trywait(sem_parent) < 0)
{
perror("sem_trywait");
}
if (sem_trywait(sem_child) < 0)
{
perror("sem_trywait");
}
}
else
{
fprintf(stderr, "Error: %s\n", strerror(errno));
perror("sem_open");
sem_close(sem_parent);
sem_close(sem_child);
sem_unlink("/sem_parent");
sem_unlink("/sem_child");
fclose(file);
exit(EXIT_FAILURE);
}
}
pid_t pid = fork();
if (pid < 0)
{
perror("fork");
sem_close(sem_parent);
sem_close(sem_child);
sem_unlink("/sem_parent");
sem_unlink("/sem_child");
fclose(file);
exit(EXIT_FAILURE);
}
if (pid == 0)
{
for (int i = 0; i < ITERATIONS; i++)
{
sem_wait(sem_child);
sleep(1);
fprintf(stderr, "Child: %d time\n", i);
write_time_to_file(file);
sem_post(sem_parent);
}
fclose(file);
sem_close(sem_parent);
sem_close(sem_child);
exit(EXIT_SUCCESS);
}
else
{
for (int i = 1; i