- 论坛徽章:
- 0
|
除了楼上说的问题外
主要是:
- if ((pid = fork ()) == 0)
复制代码
不能够这样写的,
应该
- pid = fork ();
- if (pid == 0)
复制代码
还有你读写命令管道的时候,不能写一次关掉,然后再读,管道的作用不是消息队列那样的存很多信息,而是一个通道,不能再里面存信息(正确的说可以存PIPE_BUF长度的信息)。用法基本是读写进程描述符都打开,然后互相通信,通信完毕后关掉描述符号,而不是存在里面。
简单帮你调通管道,还又不少错误,自己改吧。
- #include <stdio.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <errno.h>
- int write_to_fifo (char *data,int fd)
- {
- int len, lens;
- int n;
-
- len = strlen (data);
- printf ("strlen (data) is :%d\n", len);
- lens = len + 1;
-
-
- if ((n = write (fd, data, lens)) < 0)
- {
- printf ("write to fifo error\n");
- return -1;
- }
- printf ("write to fifo %d\n",n);
- sleep(2);
- return lens;
- }
- int read_from_fifo (char *data, int len,int fd)
- {
- int num;
-
- data = (char *)malloc (sizeof (char) * (len + 1));
- num = read (fd, data, len);
- printf ("num = %d,data[%s] \n", num,data);
- unlink ("fifo");
- return 0;
- }
- int main (int argc, char **argv)
- {
- char *s = NULL;
- char *buf = NULL;
- int m;
- int err;
- pid_t pid;
- int fdr;
- int fdw;
- s = (char *)malloc (sizeof (char) * 8);
- s = "abcdefg";
- err = mkfifo ("fifo", 0666);
- printf ("mkfifo return is %d\n", err);
- pid = fork ();
- if (pid == 0)
- {
- fdr = open ("fifo", O_RDONLY | O_NONBLOCK);
- sleep (2);
- read_from_fifo (buf, m,fdr);
- printf ("read from fifo: %s\n", buf);
- close (fdr);
- exit (0);
- }
- else if (pid > 0)
- {
- fdw = open ("fifo", O_WRONLY | O_NONBLOCK);
- m = write_to_fifo (s,fdw);
- if (m < 0)
- printf ("write_to_fifo error,errno[%d],message[%s]\n",errno,strerror(errno));
- close(fdw);
- printf ("m = %d\n", m);
-
- }
- return 0;
- }
复制代码
[ 本帖最后由 hmilymb 于 2007-1-17 16:29 编辑 ] |
|