- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在做这个作业,这已经是第 10 个版本了。问题是只有一条消息通过管道,并计算出正确的结果。以下字符串根本不通过,或者在摆弄缓冲区后只有一些字符。请帮忙,我真的在这个问题上浪费了很多时间,我需要学习这些东西以便即将进行的测试。
#include <ctype.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <string.h>
#include <stdio_ext.h>
/* Prototypes */
void usage(void);
void calchild(void);
char command[] = "<not yet set>";
int main(int argc, char **argv)
{
char input1[512];
char input2[512];
char tmp[512];
char *endptr;
char c = 0;
int a, b, result;
pid_t cpid;
int status = 0;
int stocpipe[2]; /* Server to client pipe. [0] -read; [1]- write*/
int ctospipe[2]; /* Client to server pipe. - || - */
int i = 0;
FILE *send, *receive;
if(argc > 1)
{
usage();
}
/* Pipe Setup */
if(pipe(stocpipe) != 0 || pipe(ctospipe) != 0)
{
fprintf(stderr, "ERROR: Can't create unnamed pipe! \n");
exit(EXIT_FAILURE);
}
switch(cpid = fork())
{
case -1:
fprintf(stderr, "ERROR: Can't fork! \n");
exit(EXIT_FAILURE);
break;
case 0:
/* calchild */
close(stocpipe[1]);
close(ctospipe[0]);
receive = fdopen(stocpipe[0], "r");
send = fdopen(ctospipe[1], "w");
/*Gets the string from the parent process and does the computation.*/
while(fgets(input2, 17, receive) != NULL)
{
strcpy(tmp, input2);
fprintf(stdout, "After receive: %s", tmp);
a = strtol(tmp, &endptr, 10);
fprintf(stdout, "a = %d\n", a);
b = strtol(endptr, &endptr, 10);
fprintf(stdout, "b = %d\n", b);
c = endptr[0];
/*Loops until it finds a non-space char*/
for(i = 0; isspace(c = endptr[i]); i++);
switch(c)
{
case '+':
/*add*/
result = a + b;
break;
case '-':
/*subtract*/
result = a - b;
break;
case '*':
/*multiply*/
result = a * b;
break;
case '/':
/*divide*/
result = a / b;
break;
default:
fprintf(stderr, "the funk!? %c\n", c);
break;
}
fprintf(stderr, "%d\n", result);
fprintf(send, "%d", result);
}
break;
default:
close(stocpipe[0]);
close(ctospipe[1]);
send = fdopen(stocpipe[1], "w");
receive = fdopen(ctospipe[0], "r");
/*Reads string from stdin and sends it to the child process through a pipe. */
while(fgets(input1, 17, stdin) != NULL)
{
fprintf(stdout, "Before send: %s", input1);
fwrite(input1, 17, 1, send);
if(fflush(send) == EOF)
{
fprintf(stderr, "Flush error!");
}
}
(void) waitpid(cpid, &status, 0);
if(status != 0)
{
fprintf(stderr, "ERROR: Child calculator exited with %d \n", status);
}
break;
}
return 0;
}
void usage(void)
{
fprintf(stderr,"Usage: %s", command);
exit(EXIT_FAILURE);
}
该程序是一个计算器。它的目的是学习IPC。父进程接受来自标准输入的字符串(例如 3 5 +)并将其发送给子进程。 child 解析字符串并计算结果。然后它将结果发送回父进程,然后将其打印到标准输出。
我在将字符串发送给 child 的部分卡住了。第一个接受的字符串被发送给 child 。它计算结果很好。第二个字符串和之后的每个字符串都是空的,或者至少看起来是空的。
最佳答案
注意行 fwrite(input1, 17, 1, send);
。 parent 进程可能已将 '\n' 字符后的随机内容发送到 child 进程。在 child while(fgets(input2, 17, receive) != NULL)
中,fgets
在获取 '\n' 时停止并且可能获取更少超过 17-1 个字符。它的下一个阅读管道将获得随机的东西。
一个直接的修复方法是 fwrite(input1, strlen(input1), 1, send);
。引用'man fwrite',最好使用fwrite(input1, sizeof (input1[0]), strlen(input1), send);
。
无论如何使用魔法数字 17 是危险的。请记住,PIPE 是一个连续的字符流。
关于c - 只有一条消息通过管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8631252/
我一直在读到,如果一个集合“被释放”,它也会释放它的所有对象。另一方面,我还读到,一旦集合被释放,集合就会释放它的对象。 但最后一件事可能并不总是发生,正如苹果所说。系统决定是否取消分配。在大多数情况
我有一个客户端-服务器应用程序,它使用 WCF 进行通信,并使用 NetDataContractSerializer 序列化对象图。 由于服务器和客户端之间传输了大量数据,因此我尝试通过微调数据成员的
我需要有关 JMS 队列和消息处理的帮助。 我有一个场景,需要针对特定属性组同步处理消息,但可以在不同属性组之间同时处理消息。 我了解了特定于每个属性的消息组和队列的一些知识。我的想法是,我想针对
我最近开始使用 C++,并且有一种强烈的冲动 #define print(msg) std::cout void print(T const& msg) { std::cout void
我已经为使用 JGroups 编写了简单的测试。有两个像这样的简单应用程序 import org.jgroups.*; import org.jgroups.conf.ConfiguratorFact
这个问题在这里已经有了答案: Firebase messaging is not supported in your browser how to solve this? (3 个回答) 7 个月前关
在我的 C# 控制台应用程序中,我正在尝试更新 CRM 2016 中的帐户。IsFaulted 不断返回 true。当我向下钻取时它返回的错误消息如下: EntityState must be set
我正在尝试通过 tcp 将以下 json 写入 graylog 服务器: {"facility":"GELF","file":"","full_message":"Test Message Tcp",
我正在使用 Django 的消息框架来指示成功的操作和失败的操作。 如何排除帐户登录和注销消息?目前,登录后登陆页面显示 已成功登录为“用户名”。我不希望显示此消息,但应显示所有其他成功消息。我的尝试
我通过编写禁用qDebug()消息 CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG_OUTPUT 在.pro文件中。这很好。我想知道是否可以
我正在使用 ThrottleRequest 来限制登录尝试。 在 Kendler.php 我有 'throttle' => \Illuminate\Routing\Middleware\Throttl
我有一个脚本,它通过die引发异常。捕获异常时,我想输出不附加位置信息的消息。 该脚本: #! /usr/bin/perl -w use strict; eval { die "My erro
允许的消息类型有哪些(字符串、字节、整数等)? 消息的最大大小是多少? 队列和交换器的最大数量是多少? 最佳答案 理论上任何东西都可以作为消息存储/发送。实际上您不想在队列上存储任何内容。如果队列大部
基本上,我正在尝试创建一个简单的 GUI 来与 Robocopy 一起使用。我正在使用进程打开 Robocopy 并将输出重定向到文本框,如下所示: With MyProcess.StartI
我想将进入 MQ 队列的消息记录到数据库/文件或其他日志队列,并且我无法修改现有代码。是否有任何方法可以实现某种类似于 HTTP 嗅探器的消息记录实用程序?或者也许 MQ 有一些内置的功能来记录消息?
我得到了一个带有 single_selection 数据表和一个命令按钮的页面。命令按钮调用一个 bean 方法来验证是否进行了选择。如果不是,它应该显示一条消息警告用户。如果进行了选择,它将导航到另
我知道 MSVC 可以通过 pragma 消息做到这一点 -> http://support.microsoft.com/kb/155196 gcc 是否有办法打印用户创建的警告或消息? (我找不到谷
当存在大量节点或二进制数据时, native Erlang 消息能否提供合理的性能? 情况 1:有一个大约 50-200 台机器的动态池(erlang 节点)。它在不断变化,每 10 分钟大约添加或删
我想知道如何在用户登录后显示“欢迎用户,您已登录”的问候消息,并且该消息应在 5 秒内消失。 该消息将在用户成功登录后显示一次,但在同一 session 期间连续访问主页时不会再次显示。因为我在 ho
如果我仅使用Welcome消息,我的代码可以正常工作,但是当打印p->client_name指针时,消息不居中。 所以我的问题是如何将消息和客户端名称居中,就像它是一条消息一样。为什么它目前仅将消
我是一名优秀的程序员,十分优秀!