LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 964|回复: 8

我的这个程序有什么错误.

[复制链接]
发表于 2003-5-21 23:45:15 | 显示全部楼层 |阅读模式
这个程序的任务是从标准设备读入一个小写字母.然后父进程从标准输入设备输出这个小写字母.子进程则从标准输入设备读入这个小写字母.转化为大写字母再输出到标准输出设备.我的程序是:
#include<stdio.h>
#include<fcntl.h>
main()
{
char c;
int to_par[2],to_chi[2],get_id;
pipe(to_par);
pipe(to_chi);
get_id=fork();
c=getchar();
while(c!='x')
        {
        if(get_id==0)
                {
                close(0);
                dup(to_chi[0]);
                close(1);
                dup(to_chi[1]);
                close(to_chi[0]);
                close(to_chi[1]);
                close(to_par[1]);
                close(to_par[0]);
                if(c>='a'&&c<='z')
                {
                c-=32;
                read(1,&c,1);
                }
                }
        close(0);
        dup(to_par[0]);
        close(1);
        dup(to_par[1]);
        close(to_chi[1]);
        close(to_chi[0]);
        close(to_par[0]);
        close(to_par[1]);
        read(1,&c,1);
        c=getchar();
        }
}
现象是无法显示大写字母.而且不是一按x就退出.要按回车才行.甚至有时候按了几次x都不行.
[st1866@localhost st1866]$ a.out
sxxxxxxxxxxxxxx
[st1866@localhost st1866]$ a.out
sasx
xxxxx
是不是我的代码有问题?
发表于 2003-5-22 08:33:28 | 显示全部楼层
getchar();
这个函数是要按回车后才会被程序读入的
不然只是在输入缓冲区中
发表于 2003-5-22 10:12:21 | 显示全部楼层
请看看置顶的贴子中粘贴代码的注意事项。
发表于 2003-5-22 16:29:12 | 显示全部楼层
嗯!应该用getch();
发表于 2003-5-22 17:05:47 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. int
  5. main(void)
  6. {
  7.   char c;
  8.   int fd[2];
  9.   pid_t pid;
  10.   pipe(fd);
  11.   if((pid = fork()) == -1){
  12.     perror("frok error");
  13.     exit(-1);
  14.   }else if(pid == 0){
  15.     while(read(fd[0], &c, 1) > 0){
  16.       if(c == 'x')
  17.         break;
  18.       if(c >= 'a' && c <= 'z')
  19.         c -= 32;
  20.       write(STDOUT_FILENO, &c, 1);
  21.     }
  22.   }else{
  23.     while(c = getchar()){
  24.       write(fd[1], &c, 1);
  25.       if(c == 'x')
  26.         break;
  27.       putchar(c);
  28.     }
  29.   }
  30.   
  31.   exit(0);
  32. }
复制代码
发表于 2003-5-22 17:35:54 | 显示全部楼层
while(read(fd[0], &c, 1) > 0){
      if(c == 'x')
        break;
      if(c >= 'a' && c <= 'z')
        c -= 32;
      write(STDOUT_FILENO, &c, 1);
    }
  }else{
    while(c = getchar()){
      write(fd[1], &c, 1);
      if(c == 'x')
        break;
      putchar(c);
    }
两个进程同时写屏幕
我觉得这很不好

并且写屏幕时一般直到回车后才输出
发表于 2003-5-23 17:10:44 | 显示全部楼层
我是按他的意思写的,我也不喜欢两个程序一起写屏,输出乱七八糟的,特别到最后,如果父进程先结束,子进程的输出就会把命令行搞乱,在程序最后输出\n都不行。
不过学习嘛,试一试比较好,我原来也写过这样的程序,练一练手,看看输出,以后就再也不会这么写了。
发表于 2003-5-23 19:01:27 | 显示全部楼层
输出到同一个屏幕会很乱的

所以楼主如果想同时写
不如两个进程分别写文件
 楼主| 发表于 2003-5-26 18:25:21 | 显示全部楼层
谢谢 你们介绍这么多的经验给我。
其实这是老师的作业。我也不想两个进程同时写屏,那是我的表达有误。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表