user-0 提问: 求C语言大神关于即时输出的问题

回复:
user: user-0
content: 已经解决，谢谢各位大神为我指点迷津，小弟在这里感激不尽

user: user-1
content: 用共享内存的 程序1 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/ipc.h> #include <sys/shm.h> #define KEY 12345 #define HAVE_ADDEND 1 #define NO_ADDEND 0  int main() { 	int a,b; 	int shmid; 	int *shmaddr;  	shmid = shmget((key_t)KEY,512,IPC_CREAT); 	shmaddr = (int *)shmat(shmid,NULL,0); 	memset(shmaddr,0,512); 	while(1) 	{ 		while(*shmaddr == NO_ADDEND) 		{ 			printf("please input addends:"); 			scanf("%d%d",&a,&b); 			*(shmaddr+1) = a; 			*(shmaddr+2) = b; 			*shmaddr = HAVE_ADDEND;	 		} 	} 	return 0; } 程序2 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/ipc.h> #include <sys/shm.h> #define KEY 12345 #define HAVE_ADDEND 1 #define NO_ADDEND 0  int main() { 	int shmid; 	int *shmaddr;  	shmid = shmget((key_t)KEY,512,IPC_CREAT|0644); 	shmaddr = (int *)shmat(shmid,NULL,0); 	while(1) 	{ 		while(*shmaddr == HAVE_ADDEND) 		{ 			printf("sum = %d\n",*(shmaddr+1)+*(shmaddr+2)); 			*shmaddr = NO_ADDEND;	 		} 	} 	return 0; }

user: user-1
content: 参考一下吧，把加数当参数通过exec函数传给第二个程序。 程序1 #include<stdio.h> #include<stdlib.h> #include<unistd.h> #define N 10 int main() { 	char a[N],b[N];  	printf("please input addends:"); 	scanf("%s%s",a,b); 	if(execl("/root/program2","program2",a,b,(char *)0) < 0) 	{ 		printf("exec error\n"); 		exit(1); 	} 	return 0; } 程序2 #include<stdio.h> #include <stdlib.h> int main(int argc,char *argv[]) { 	printf("sum = %d\n",atoi(argv[1])+atoi(argv[2])); 	return 0; }

user: user-2
content: 直接在输入数据之后用system(程序名)函数不就行了吗？

user: user-3
content: //这是读管道文件 #include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include <string.h> #include <stdlib.h> #include <unistd.h>  #define PATH	"./fifo_buf" #define MAX		1024  int main() { 	int fd; 	char buf[MAX]; 	int fread;  	//打开管道 	fd = open(PATH, O_RDONLY, 0644); 	if (0 > fd) 	{ 		printf("open error!\n"); 		return -1; 	}  	while (1) 	{ 		memset(buf, 0, MAX);  		//从管道中读取数据 		if (0 > (fread = read(fd, buf, MAX))) 		{ 			printf("read error!\n"); 			return -1; 		}  		//quit退出 		if (0 == strncmp(buf, "quit", 4)) 		{ 			printf("read : %s\n", buf); 			break; 		}  		printf("read : %s\n", buf); 	}  	return 0; }   //这是写管道文件 #include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include <string.h> #include <stdlib.h> #include <unistd.h>  #define PATH	"./fifo_buf" #define MAX		1024  int main() { 	int fd; 	char buf[MAX]; 	int fwrite;  	//创建管道文件 	if ((0 > mkfifo(PATH, 0777)) && (errno != EEXIST)) 	{ 		printf("mkfifo error!\n"); 		return -1; 	}  	//打开管道文件，读写方式打开 	fd = open(PATH, O_RDWR | O_NONBLOCK, 0); 	if (0 > fd) 	{ 		printf("open error!\n"); 		return -1; 	}  	while (1) 	{ 		memset(buf, 0, MAX);  		printf("please enter:"); 		scanf("%[^1023\n]", buf); 		while(getchar() != '\n');  		//往管道中写入数据 		if (0 > (fwrite = write(fd, buf, MAX))) 		{ 			printf("write error!\n"); 			return -1; 		}  		//quit退出 		if (0 == strncmp(buf, "quit", 4)) 		{ 			close(fd); 			break; 		} 	}  	return 0; }    写的不好，希望理解。

user: user-0
content: 能不能写个例子程序让我参考一下，我已经卡在这里2天了一点进展都没有。。。

user: user-4
content: 多进程，加互斥锁

user: user-3
content: 如果你要实现即时输出那只能通过这种互斥的机制来实现，因为你不可能对同一样东西进行两种操作，就像你取钱一样，不能一边打钱到你的卡上，一边从你的卡上取钱。而且这种同步互斥机智在C语言中很常见，而且运用也比较广泛，可以借这个机会学习一下。

user: user-0
content: 用管道是不是编程很难啊？之前没学过，唉。。

user: user-3
content: 可以用同步互斥的机制实现，一边写，另一边则等待，写的同时不能读，等到写结束后，另外一边才能读该文件。用管道可以，一边在管道中写入数据，一边在管道中读取数据。

user: user-0
content: 是要重新编写一个程序来实现还是在程序里面加上fflush()?

user: user-5
content: 你需要保证，你的第二个程序读文件的时候，你的第一个程序已经将 数据写进了文件！  fflush()

user: user-0
content: 不要沉，不要沉