gpt4 book ai didi

c - 使用命名管道的程序崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 08:34:23 24 4
gpt4 key购买 nike

该程序是关于通过 FIFO 创建的人之间提供消息,

./a.out create name_of_person

第一个条件 if( strcmp(argv[1], "create") == 0 ) 正常工作,但在那之后,选择 ./a.out name1 name2 消息 并且在编译程序时挂起(这是其他情况)。

我该如何解决这个问题?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>

int main(int argc, char* argv[]) {

int i = 0;
int fifo = -1;

if( strcmp(argv[1], "create") == 0 ) {
int fifo = mkfifo(argv[2], 0666);

if( ( fifo == -1) ) {
perror("\n The problem occured. The program exited. \n");
printf("error %d : %s \n", errno, strerror (errno));
exit( 1 );
}
}

else if( strcmp(argv[2], "history") == 0 ) {

int process1 = fork();

if( process1 == 0 ) {

int process2 = fork();

if( process2 == 0 )
{
char c;
if (fifo == 0) {
int FILE = open(argv[1], O_RDONLY);

for(i=3; i<argc; i++) {
read( FILE, argv[i], 1 );
//while( ( Scanner = read( odFILE, &c, 1) ) > 0 )
}

close( FILE );
}
}
kill();
}
}

else
{

if( (open(argv[1], O_RDONLY, 0777) == -1) || (open(argv[2], O_RDONLY, 0777) == -1) )
{
perror("The user does not exist.");
exit(1);
}

printf("< ");
printf("%s", argv[1]);
printf(" -> ");
printf("%s", argv[2]);
printf(" > : ");

for(i=3; i<argc; i++) printf("%s", argv[i]);

int process1 = fork();

if( process1 == 0 ) {



int process2 = fork();

if( process2 == 0 ) {
int FILE = open(argv[2], O_RDONLY);
write( FILE, argv[3], sizeof(argv[3]) );
close( FILE );
}

kill();
}
}

return 0;
}

最佳答案

来自 man 3 mkfifo:

However, it has to be open at both ends simultaneously before you can proceed to do any input or output operations on it. Opening a FIFO for reading normally blocks until some other process opens the same FIFO for writing, and vice versa.

在你的行中

if( (open(argv[1], O_RDONLY, 0777) == -1) || (open(argv[2], O_RDONLY, 0777) == -1) )

您正在打开两个 fifos 进行读取。两次打开都将阻塞,直到写入器也打开 fifo。顺便说一句,这 if 会泄漏两个打开的文件描述符。

你的后期处理

int FILE = open(argv[2], O_RDONLY);
write( FILE, argv[3], sizeof(argv[3]) );
close( FILE );

在打开期间有相同的阻塞问题,直到写入打开 fifo。还有另一个问题:您打开 fifo 只是为了读取,但您只是写入它。

您需要替换您的open 以检查文件是否存在。将其删除 - 您稍后打开将失败 - 或将其替换为 stat。并且您需要实现消息传递的两侧以对其进行测试,而不仅仅是一侧(或者您需要运行 shell 命令以与您的程序并行写入或读取 fifo 以对其进行测试)。

代码中的其他问题:

  1. 您没有为 kill 包含正确的 header - 并且您在调用 kill 时没有提供所需的参数。
  2. 您没有为 mkfifo 包含正确的 header 。

您应该考虑启用更多警告以查看代码中的这些问题。

关于c - 使用命名管道的程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26932111/

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