我有一个非常简单的怀疑。我正在尝试使用命名管道进行通信的两个进程。它运行正常但是当我按下ans的时候,它没有执行main的返回。但在父母的过程中打印“从孩子那里收到:”。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#include<string.h>
#include<ctype.h>
#include<wait.h>
#define NP1 "/tmp/np1"
#define NP2 "/tmp/np2"
#define MAX_BUF_SIZE 255
#include <sys/types.h>
int main()
{
int rdfd, wrfd, ret_val, count, numread;
char buf[MAX_BUF_SIZE];
char ans;
char cp[50];
pid_t pid;
ret_val = mkfifo(NP1,0666);
if ((ret_val == -1) && (errno != EEXIST)) {
perror("Error creating the named pipe");
exit (1);
}
ret_val = mkfifo(NP2, 0666);
if ((ret_val == -1) && (errno != EEXIST)) {
perror("Error creating the named pipe");
exit (1);
}
printf("\nSEND SOMETHING TO PARENT PROCESS\t");
scanf("%[^\n]%*c",&ans);
pid=fork();
if (pid==-1) {
printf("\nERROR IN PID");
exit(1);
}
while (ans=='y' || ans=='Y') {
if (pid!=0) {
//PARENT PROCESS
/* Open the first named pipe for reading */
rdfd = open(NP1, O_RDONLY);
numread = read(rdfd, buf, MAX_BUF_SIZE);
buf[numread] = '\0';
printf("RECEIVED From the CHILD : %s\n", buf);
/* Convert to the string to upper case */
count = 0;
while (count < numread) {
buf[count] = toupper(buf[count]);
count++;
}
wrfd = open(NP2, O_WRONLY);
/* Write the converted string back to the second pipe */
write(wrfd, buf, strlen(buf));
} else {
//CHILD PROCESS
printf("\nEnter data to be sent to PARENT\t");
fgets(cp, 50, stdin);
wrfd = open(NP1, O_WRONLY);
/* Write to the pipe */
write(wrfd, cp, strlen(cp)+1);
/* Open the second named pipe for reading */
rdfd = open(NP2, O_RDONLY);
/* Read from the pipe */
numread = read(rdfd, buf, MAX_BUF_SIZE);
buf[numread] = '\0';
printf("RECEIVED From the PARENT : %s\n", buf);
printf("\nSEND SOMETHING TO PARENT PROCESS\t");
fflush(stdin);
scanf(" %[^\n]%*c",&ans);
}
}
return 0;
}
答案 0 :(得分:0)
我认为while(ans=='y' || ans=='Y')
你编码,所以在那个循环中代码是没用的,只需返回主窗口。
if(ans=='n')
return(0); //NOT WORKING
<强>更新强>
您的问题在child
和parents
每个进程都有自己的内存空间。进程通常无法访问其他进程的内存。
在fork的情况下,child
进程的内存空间作为父项的精确副本开始。这包括变量,代码等。在一个中更改任何这些不会改变其他类似变量
因此,您在ans
中修改了child
变量,这绝不会影响parent
进程。因此,当您按下kill
时,可以使某些n
例程终止。在scanf
函数
if(ans=='n' || ans == 'N')
{
printf("going to exit communication:\n");
kill(pid, SIGTERM);
}
答案 1 :(得分:0)
代码的问题是当你给孩子输入n作为输入时,父母仍然是活着的,所以为了杀死父母使用从父母读书返回以查看孩子是否已经退出然后如果孩子已经退出,然后退出父母。这可以通过编辑代码来完成
if( (numread = read(rdfd, buf, MAX_BUF_SIZE)) == 0)
return 0;
实际上,一旦你在孩子中输入n作为输入,孩子退出,然后在父进程中比较你的y的旧值,因此它不会退出....
检查n回复...谢谢......
答案 2 :(得分:0)
scanf(" %[^\n]%*c",&ans);
为什么你使用这么多格式化可能是这个问题,为了避免我们刚刚放入数据的新行问题
scanf(" %c",&ans);
另一个原因是它是两个不同的过程而另一个是等待阅读而你正在尝试写作或反对可能再次出现问题。一些字符串和字符读取会产生问题我面对这个并避免这种情况我使用不同的输入函数,例如用于字符串放置和获取等。