Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

The ØMQ Guide Chapter 2 #2

Closed
dlintw opened this issue Sep 10, 2010 · 1 comment
Closed

The ØMQ Guide Chapter 2 #2

dlintw opened this issue Sep 10, 2010 · 1 comment

Comments

@dlintw
Copy link

dlintw commented Sep 10, 2010

// in The Socket API section's first sample code

zmq_msg_t mouse;
mouse = zmq_msg_init (&mouse); // <-- this line must exist bug
zmq_recv (mousetrap, &mouse, 0);

@hintjens
Copy link
Contributor

Thanks for catching this!

rfarnham added a commit to rfarnham/zguide that referenced this issue May 22, 2020
It is important to set both ends of the self pipe as nonblocking, otherwise
the signal handler might block on the `write` call  and the process will deadlock.
Example:
```
(lldb) bt
* thread booksbyus#1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
  * frame #0: 0x00007fff5f09ff46 libsystem_kernel.dylib`write + 10
    frame booksbyus#1: 0x000000010f8f9cd2 interrupt`s_signal_handler(signal_value=2) at interrupt.c:20:12
    frame booksbyus#2: 0x00007fff5f152b5d libsystem_platform.dylib`_sigtramp + 29
    frame booksbyus#3: 0x000000010f8f981a interrupt`burn_cpu at interrupt.c:44:3
    frame booksbyus#4: 0x000000010f8f9b60 interrupt`main at interrupt.c:114:23
    frame booksbyus#5: 0x00007fff5ef673d5 libdyld.dylib`start + 1
    frame booksbyus#6: 0x00007fff5ef673d5 libdyld.dylib`start + 1
(lldb) f 1
frame booksbyus#1: 0x000000010f8f9cd2 interrupt`s_signal_handler(signal_value=2) at interrupt.c:20:12
   17  	#define S_ERROR_MSG "Error while writing to self-pipe.\n"
   18  	static int s_fd;
   19  	static void s_signal_handler(int signal_value) {
-> 20  	  int rc = write(s_fd, S_NOTIFY_MSG, sizeof(S_NOTIFY_MSG));
   21  	  if (rc != sizeof(S_NOTIFY_MSG)) {
   22  	    write(STDOUT_FILENO, S_ERROR_MSG, sizeof(S_ERROR_MSG) - 1);
   23  	    perror("error writing\n");
```

Original code was buggy, as it did not use the loop variable `i`:
```
    for (int i = 0; i < 2; i++) {
        int flags = fcntl(pipefds[0], F_GETFL, 0);
        if (flags < 0) {
            perror ("fcntl(F_GETFL)");
            exit(1);
        }
        rc = fcntl (pipefds[0], F_SETFL, flags | O_NONBLOCK);
        if (rc != 0) {
            perror ("fcntl(F_SETFL)");
            exit(1);
        }
    }
```
The loop was erroneously removed in this commit booksbyus@aebc4b5
rfarnham added a commit to rfarnham/zguide that referenced this issue May 22, 2020
It is important to set both ends of the self pipe as nonblocking, otherwise
the signal handler might block on the `write` call  and the process will deadlock.
Example:
```
(lldb) bt
* thread booksbyus#1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
  * frame #0: 0x00007fff5f09ff46 libsystem_kernel.dylib`write + 10
    frame booksbyus#1: 0x000000010f8f9cd2 interrupt`s_signal_handler(signal_value=2) at interrupt.c:20:12
    frame booksbyus#2: 0x00007fff5f152b5d libsystem_platform.dylib`_sigtramp + 29
    frame booksbyus#3: 0x000000010f8f981a interrupt`burn_cpu at interrupt.c:44:3
    frame booksbyus#4: 0x000000010f8f9b60 interrupt`main at interrupt.c:114:23
    frame booksbyus#5: 0x00007fff5ef673d5 libdyld.dylib`start + 1
    frame booksbyus#6: 0x00007fff5ef673d5 libdyld.dylib`start + 1
(lldb) f 1
frame booksbyus#1: 0x000000010f8f9cd2 interrupt`s_signal_handler(signal_value=2) at interrupt.c:20:12
   17  	#define S_ERROR_MSG "Error while writing to self-pipe.\n"
   18  	static int s_fd;
   19  	static void s_signal_handler(int signal_value) {
-> 20  	  int rc = write(s_fd, S_NOTIFY_MSG, sizeof(S_NOTIFY_MSG));
   21  	  if (rc != sizeof(S_NOTIFY_MSG)) {
   22  	    write(STDOUT_FILENO, S_ERROR_MSG, sizeof(S_ERROR_MSG) - 1);
   23  	    perror("error writing\n");
```

Original code was buggy, as it did not use the loop variable `i`:
```
    for (int i = 0; i < 2; i++) {
        int flags = fcntl(pipefds[0], F_GETFL, 0);
        if (flags < 0) {
            perror ("fcntl(F_GETFL)");
            exit(1);
        }
        rc = fcntl (pipefds[0], F_SETFL, flags | O_NONBLOCK);
        if (rc != 0) {
            perror ("fcntl(F_SETFL)");
            exit(1);
        }
    }
```
The loop was erroneously removed in this commit booksbyus@aebc4b5
This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants