#include <stdio.h>
int main() {
char file1[100], file2[100];
FILE *fptr1, *fptr2;
char c;
printf("Enter the filename (file1): ");
scanf("%s", file1);
// 判断文件是否存在
if ((fptr1 = fopen(file1, "r")) == NULL) {
printf("Filename does not exist\n");
return 1; // 终止程序
}
// 判断文件是正常文件还是目录
if (isFile(file1)) {
printf("Filename is regular file\n");
} else {
printf("Filename is directory\n");
return 0;
}
// 创建并拷贝文件内容到file2
printf("Enter the new filename (file2): ");
scanf("%s", file2);
fptr2 = fopen(file2, "w");
while ((c = fgetc(fptr1)) != EOF) {
fputc(c, fptr2);
}
fclose(fptr1);
fclose(fptr2);
printf("File content copied to file2 successfully\n");
return 0;
}
// 判断文件是否为正常文件
int isFile(const char *path) {
struct stat path_stat;
stat(path, &path_stat);
return S_ISREG(path_stat.st_mode);
}
第一部分:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
int pipe_fd[2];
void sig_handler(int signo) {
// Signal handler function
if (signo == SIGUSR1) {
printf("Child process received signal to read from pipe\n");
char buffer[100];
read(pipe_fd[0], buffer, sizeof(buffer));
printf("Child process read: %s\n", buffer);
// Write to terminal
printf("Child process writing to terminal: %s\n", buffer);
} else if (signo == SIGUSR2) {
printf("Parent process received signal to write to pipe\n");
char *msg = "Hello from parent";
write(pipe_fd[1], msg, sizeof(msg));
}
}
int main() {
if (pipe(pipe_fd) < 0) {
perror("pipe error");
exit(1);
}
pid_t pid;
if ((pid = fork()) < 0) {
perror("fork error");
exit(1);
} else if (pid > 0) { // Parent process
close(pipe_fd[0]); // Close reading end of the pipe in parent
// Write to pipe
char *msg = "Hello from parent";
write(pipe_fd[1], msg, sizeof(msg));
signal(SIGUSR1, sig_handler); // Set up signal handler for SIGUSR1
wait(NULL); // Wait for child process to complete
} else { // Child process
close(pipe_fd[1]); // Close writing end of the pipe in child
signal(SIGUSR2, sig_handler); // Set up signal handler for SIGUSR2
pause(); // Wait for signal from parent
kill(getppid(), SIGUSR1); // Send signal to parent
}
return 0;
}
第二部分
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <signal.h>
#define MSG_SIZE 128
struct msg_buffer {
long msg_type;
char msg_text[MSG_SIZE];
};
int msgid;
void sig_handler(int signo) {
struct msg_buffer message;
if (signo == SIGUSR1) {
printf("Writer process received signal to write to message queue\n");
// Send message to queue
message.msg_type = 1;
sprintf(message.msg_text, "Hello from writer");
msgsnd(msgid, &message, sizeof(message), 0);
} else if (signo == SIGUSR2) {
printf("Reader process received signal to read from message queue\n");
msgrcv(msgid, &message, sizeof(message), 1, 0);
printf("Reader process read: %s\n", message.msg_text);
// Write to terminal
printf("Reader process writing to terminal: %s\n", message.msg_text);
}
}
int main() {
key_t key = ftok("progfile", 65);
msgid = msgget(key, 0666 | IPC_CREAT);
if (msgid == -1) {
perror("msgget error");
exit(1);
}
pid_t pid = fork();
if (pid < 0) {
perror("fork error");
exit(1);
} else if (pid > 0) { // Writer process
signal(SIGUSR1, sig_handler); // Set up signal handler for SIGUSR1
pause(); // Wait for signal from reader
kill(pid, SIGUSR2); // Send signal to reader
} else { // Reader process
signal(SIGUSR2, sig_handler); // Set up signal handler for SIGUSR2
pause(); // Wait for signal from writer
kill(getppid(), SIGUSR1); // Send signal to writer
}
return 0;
}