ZBLOG

#include #include #include #include #include #include "sem_pv.h" int main(void) { key_t key; int pid,fd,semid,n; char str[80]; key=ftok(".",5); semid=sem_init(key); fd=open("test.txt",O_...

你的代码是一个C语言程序,主要实现了父子进程间的同步读写操作,使用了信号量机制来控制对共享资源(文件)的访问。以下是代码的一些要点和可能的问题:

代码功能

  1. 文件创建与打开:程序首先通过open函数创建或打开名为test.txt的文件。
  2. 信号量初始化:使用自定义的sem_init函数初始化信号量,以便父进程和子进程可以安全地访问共享资源。
  3. 进程创建:通过fork()创建一个子进程。
  4. 父进程逻辑
    • 等待用户输入字符串并将其写入文件中。
  5. 子进程逻辑
    • 睡眠1秒后读取文件中的内容并打印出来。

注意事项

  • 使用 gets() 函数是不安全的,因为它不检查缓冲区溢出,建议使用 fgets() 替代。
  • 对于信号量和其他 IPC 机制,需要确保正确处理错误返回值,例如在创建、初始化和操作信号量时。
  • 在多次调用 fork() 时,要注意每个子进程都会继承父进程的文件描述符,避免出现意外的行为。

改善建议

下面是经过改进后的代码片段,解决了一些潜在问题:

#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h> 
#include <sys/wait.h>
#include <string.h>
#include "sem_pv.h"

int main(void)
{ 
    key_t key;
    int pid, fd, semid, n; 
    char str[80];
    
    // 创建唯一键值
    key = ftok(".", 5);
    
    // 初始化信号量
    semid = sem_init(key);
    
    // 打开/创建文件 test.txt
    fd = open("test.txt", O_RDWR | O_CREAT | O_TRUNC, 0644);
    
    while ((pid = fork()) == -1); /* 重试直到成功 */

    if (pid == 0) /* 子进程 */
    { 
        sleep(1);
        
        // P 操作 (等待)
        sem_p(semid);

        lseek(fd, 0, SEEK_SET);
        read(fd, str, sizeof(str));

        // V 操作 (释放)
        sem_v(semid);

        printf("child: read str from test file: %s\n", str);
        exit(0);
    } 
    else /* 父进程 */
    {
        // P 操作 (等待)
        sem_p(semid);

        printf("parent: please enter a string for test file (strlen<80):\n");
        
        // 使用 fgets 替代 gets 避免缓冲区溢出
        fgets(str, sizeof(str), stdin);
        
        n = strlen(str);
        
        lseek(fd, 0, SEEK_SET); 
        write(fd, str, n);

        // V 操作 (释放)
        sem_v(semid);

        wait(NULL); /* 等待子进程结束 */
        
        close(fd); /* 关闭文件描述符 */
        
        sem_rmv(semid); /* 移除信号量 */
        
        exit(0);
     }
}

总结

该程序示范了如何使用 C 程序进行父子进程间的数据共享,并引入基本的同步机制。请根据具体需求对以上代码进行适当修改和测试。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=5613

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?