gpt4 book ai didi

c - Fork() 与 FIFO

转载 作者:行者123 更新时间:2023-11-30 17:01:37 25 4
gpt4 key购买 nike

我在这项任务中经历了最艰难的时期。所以这个作业我有两个 child (两个独立的程序),他们必须写信给 parent (主要)。家长必须从 child 那里读取这两个数据,然后将其打印出来。我必须使用命名管道。嗯,所以我的 FIFO 不断向我发送“USAGE: NAMEPIPECLIENT[String]”消息,但我不知道为什么。顺便说一句,该消息位于客户端。另外,如果有人能给我指明如何在单独的文件上使用带有多个子项的 fork 的好方向,我将非常感激。提前致谢!使用 GNU C

我的读者

#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<linux/stat.h>
#define FIFO_FILE "MYFIFO" //default is current directory
int main(void){
FILE *fpoint;
char readbuffer[80];
int again = 1;
mknod(FIFO_FILE, S_IFIFO | 0666, 0);
while(again){
fpoint = fopen(FIFO_FILE, "r");
fgets(readbuffer, 80, fpoint);
printf("recevived string: %s\n, readbuffer");
fclose(fpoint);
if(strcmp(readbuffer, "stop") == 0 ) again = 0;
return(0);
}//exit main
}

我的作家

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/stat.h>
#include<linux/stat.h>
#define FIFO_FILE "MYFIFO"
int main(int argc, char *argv[]){
FILE *fpoint;
int again =1;
char strIn[80] = "Use message from command line";
if(argc !=2){
printf("USAGE: NamedPipeClient[string]\n");
exit(1);
}
strcpy(strIn, argv[1]);
while(again == 1){
if((fpoint = fopen (FIFO_FILE, "w")) == NULL){
perror("fopen");
exit(1);
}
fputs(strIn, fpoint);
fclose(fpoint);
printf("Enter message to send: ");
scanf("%s", strIn);
again = strcmp(strIn, "Stop");
}

if((fpoint = fopen(FIFO_FILE, "w")) == NULL){
perror("fopen");
exit(1);
}

fputs(strIn,fpoint);
fclose(fpoint);
return(0);
}

最佳答案

这是编写过程的经过广泛修正的版本

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
//#include<sys/stat.h>
//#include<linux/stat.h>

#define FIFO_FILE "MYFIFO"

int main(int argc, char *argv[])
{
if(argc !=2)
{
printf("USAGE: NamedPipeClient[string]\n");
exit(1);
}

FILE *fpoint;
if((fpoint = fopen (FIFO_FILE, "w")) == NULL)
{
perror("fopen");
exit(1);
}

char strIn[80];
strcpy(strIn, argv[1]);


int again =1;
while(again == 1)
{
fputs(strIn, fpoint);

printf("Enter message to send: ");
scanf("%79s", strIn);
again = strcmp(strIn, "Stop");
}

fputs(strIn,fpoint);
fclose(fpoint);
return(0);
}

这是只读取一个字符串的主要原因:

while(again)
{
fpoint = fopen(FIFO_FILE, "r");
fgets(readbuffer, 80, fpoint);
printf("recevived string: %s\n, readbuffer");
fclose(fpoint);
if(strcmp(readbuffer, "stop") == 0 ) again = 0;
return(0);
}

请注意,该函数仅在循环一次后返回。

建议:

while(again)
{
fpoint = fopen(FIFO_FILE, "r");
fgets(readbuffer, 80, fpoint);
printf("recevived string: %s\n, readbuffer");
fclose(fpoint);
if(strcmp(readbuffer, "stop") == 0 ) again = 0;
}

return 0;

注意:return 不是函数(类似于 sizeof 不是函数),因此不需要括号。

注意:不断打开和关闭 FIFO 不是一个好主意。

建议在任何一个进程中只打开一次。

建议在任何一个进程中仅关闭一次。

调用fopen()时,请务必检查返回值以确保操作成功。

关于c - Fork() 与 FIFO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36928990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com