Linux

#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;
}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值