- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我必须在两个不同的终端上运行进程(服务器和客户端)。客户端读取用户输入,将其保存到文件 (hello.txt),发出 SIGUSR1 信号,然后休眠。然后服务器醒来,读取文件 (hello.txt),打印它,向客户端发出它工作的信号,然后休眠。然后客户端醒来,打印它成功,然后等待另一个用户输入。
稍后还有更多内容,但这就是我目前想要完成的全部工作。我很难找到在两个独立的、不相关的进程之间使用 sigaction 和 SIGUSR1 的示例。这是我到目前为止的代码:
服务器.c
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
volatile sig_atomic_t myFlag = 0;
static void myHandler(int);
struct sigaction newAction, oldAction;
int main(int argc, char* argv[])
{
//setup signal stuff
sigset_t zeromask;
sigemptyset(&newAction.sa_mask);
sigemptyset (&oldAction.sa_mask);
sigemptyset(&zeromask);
newAction.sa_flags = 0;
newAction.sa_handler = myHandler;
sigaddset (&newAction.sa_mask, SIGUSR1);
if ( sigaction(SIGUSR1, &newAction, &oldAction))
return;
for ( ; ; ) {
//Loop
//This is so I can manually enter the pid into the client
printf("%d\n",getpid());
while(myFlag == 0)
sigsuspend (&zeromask);
myFlag = 0;
printf("Got signal, process it\n");
//signal occured process it
}
sigprocmask (SIG_SETMASK, &oldAction.sa_mask, NULL);
exit(0);
}
static void myHandler(int sigNo) {
myFlag = 1;
printf("finally made it");
sigprocmask (SIG_BLOCK, &newAction.sa_mask, &oldAction.sa_mask);
return;
}
客户端.c
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
volatile sig_atomic_t myFlag = 0;
static void myHandler(int);
struct sigaction newAction, oldAction;
int main(int argc, char* argv[])
{
printf("begin\n");
//Signal stuff
sigset_t zeromask;
sigemptyset(&newAction.sa_mask);
newAction.sa_flags = 0;
newAction.sa_handler = myHandler;
sigemptyset (&oldAction.sa_mask);
sigemptyset(&zeromask);
sigaddset (&newAction.sa_mask, SIGUSR1);
if ( sigaction(SIGUSR1, &newAction, &oldAction))
return;
sigprocmask (SIG_BLOCK, &newAction.sa_mask, &oldAction.sa_mask);
//loop
for ( ; ; ) {
printf("This is where you would get user input\n");
//Signal Server
//For now I just manually enter the pid that was printed out when I ran server.c. This does not work and I do not think it is the right thing to do
kill(27514,SIGUSR1);
//loop while waiting for server to respond
while(myFlag == 0)
sigsuspend (&zeromask);
myFlag = 0;
printf("this is where you would process return signal\n");
//signal occured process it
}
sigprocmask (SIG_SETMASK, &oldAction.sa_mask, NULL);
exit(0);
}
static void myHandler(int sigNo) {
myFlag = 1;
sigprocmask (SIG_BLOCK, &newAction.sa_mask, &oldAction.sa_mask);
return;
}
现在所有这些代码应该做的是从客户端向服务器发送信号。从那里我将实现其余部分。但是,这不起作用,我似乎无法弄清楚。
kill 是用于实现 SIGUSR1 的正确命令吗?我需要知道每个客户端和服务器的 PID 以便它们进行通信吗?我是不是完全做错了事?
最佳答案
你没有说明实际发生了什么,但要回答你的问题:
“kill 是用于实现 SIGUSR1 的正确命令吗?”是的。
“我需要知道每个客户端和服务器的 PID 以便它们进行通信吗?”是的。
“我是不是完全做错了事?”是的。
使用信号的主要问题是 1) 它会在您的程序执行过程中随时到达,并且 2) 您只能在特定时间准备好处理它。
您上面的代码只会正确处理信号,如果它恰好在 sigsuspend() 中,等待。并非每时每刻都是如此!当您处于循环的其他部分时,即当您将 kill() 发送到另一个进程时,请考虑如果另一个进程 kill() 在您再次到达 sigsuspend 之前返回会发生什么......您赢了等待信号,它会来来去去。您的实现不可靠。
更可靠的实现是在进程之间使用套接字连接;你可以通过这样的连接来传递信号甚至数据本身。事实上有很多方法可以做到这一点,参见http://en.wikipedia.org/wiki/Inter-process_communication (而且您似乎在使用上面的 POSIX 接口(interface))。
结果是信号是异步的,会中断任何程序的流程,并且特定于您的程序,您并不总是为它做好准备,如果您错过了它,它就消失了。使用套接字(或管道或其他具有实际文件描述符的东西),数据(您的信号)将导致 select() 或 poll() 返回,而不是仅仅飞过。
关于c - 使用 SIGUSR1 的两个进程之间的 Posix 可靠信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14965975/
所以我目前正在研究 C 中的 POSIX 线程和信号编程。我的讲师使用 sigset(int sigNumber, void* signalHandlerFUnction) 因为他的笔记不是世界上最好
我正在制作一个 C++ 游戏,它要求我将 36 个数字初始化为一个 vector 。你不能用初始化列表初始化一个 vector ,所以我创建了一个 while 循环来更快地初始化它。我想让它把每个数字
我正在尝试让 Python 发送 EOF信号 (Ctrl+D) 通过 Popen() .不幸的是,我找不到任何关于 Popen() 的引用资料。 *nix 类系统上的信号。这里有谁知道如何发送 EOF
我正在尝试让 Python 发送 EOF信号 (Ctrl+D) 通过 Popen() .不幸的是,我找不到任何关于 Popen() 的引用资料。 *nix 类系统上的信号。这里有谁知道如何发送 EOF
我正在学习编码并拥有一个实时的 Django 项目来保持我的动力。在我的 Django 应用程序中,用户留下评论,而其他人则回复所述评论。 每次用户刷新他们的主页时,我都会计算他们是否收到了关于他们之
登录功能中的django信号有什么用?用户已添加到请求 session 表中。那么 Django auth.login 函数中对信号的最后一行调用是什么? @sensitive_post_param
我已经将用户的创建与函数 create_user_profile 连接起来,当我创建我的用户时出现问题,我似乎连接的函数被调用了两次,而 UserProfile 试图被创建两次,女巫触发了一个错误 列
我有一个来自生产者对象处理的硬件的实时数据流。这会连接到一个消费者,该消费者在自己的线程中处理它以保持 gui 响应。 mainwindow::startProcessing(){ QObje
在我的 iPhone 应用程序中,我想提供某种应用程序终止处理程序,该处理程序将在应用程序终止之前执行一些最终工作(删除一些敏感数据)。 我想尽可能多地处理终止情况: 1) 用户终止应用 2) 设备电
我试图了解使用 Angular Signals 的优势。许多解释中都给出了计数示例,但我试图理解的是,与我下面通过变量 myCount 和 myCountDouble 所做的方式相比,以这种方式使用信
我对 dispatch_uid 的用法有疑问为信号。 目前,我通过简单地添加 if not instance.order_reference 来防止信号的多次使用。 .我现在想知道是否dispatch
有时 django 中的信号会被触发两次。在文档中,它说创建(唯一)dispatch_uid 的一个好方法是模块的路径或名称[1] 或任何可哈希对象的 ID[2]。 今天我尝试了这个: import
我有一个用户定义的 shell 项目,我试图在其中实现 cat 命令,但允许用户单击 CTRL-/ 以显示下一个 x 行。我对信号很陌生,所以我认为我在某个地方有一些语法错误...... 主要...
http://codepad.org/rHIKj7Cd (不是全部代码) 我想要完成的任务是, parent 在共享内存中写入一些内容,然后 child 做出相应的 react ,并每五秒写回一些内容
有没有一种方法可以找到 Qt 应用程序中信号/槽连接的总数有人向我推荐 Gamma 射线,但有没有更简单的解决方案? 最佳答案 检查 Qt::UniqueConnection . This is a
我正在实现一个信号/插槽框架,并且到了我希望它是线程安全的地步。我已经从 Boost 邮件列表中获得了很多支持,但由于这与 boost 无关,我将在这里提出我的未决问题。 什么时候信号/槽实现(或任何
在我的代码中,我在循环内创建相同类型的新对象并将信号连接到对象槽。这是我的试用版。 A * a; QList aList; int aCounter = 0; while(aCounter aLis
我知道 UNIX 上的 C 有 signal() 可以在某些操作后调用某些函数。我在 Windows 上需要它。我发现了,它存在什么 from here .但是我不明白如何正确使用它。 我在 UNIX
目前我正在将控制台 C++ 项目移植到 Qt。关于移植,我有一些问题。现在我的项目调整如下我有一个派生自 QWidget 的 Form 类,它使用派生自 QObject 的其他类。 现在请告诉我我是否
在我的 Qt 多线程程序中,我想实现一个基于 QObject 的基类,以便从它派生的每个类都可以使用它的信号和槽(例如抛出错误)。 我实现了 MyQObject : public QObject{..
我是一名优秀的程序员,十分优秀!