atexit | running deferred functions in case of abnormal exit | Cryptocurrency library

 by   perillo Go Version: Current License: BSD-3-Clause

kandi X-RAY | atexit Summary

kandi X-RAY | atexit Summary

atexit is a Go library typically used in Blockchain, Cryptocurrency, Ethereum applications. atexit has no bugs, it has no vulnerabilities, it has a Permissive License and it has low support. You can download it from GitHub.

Package atexit implements support for running deferred functions in case of abnormal exit (in contrast to a normal exit when the program returns from the main function). Since calling os.Exit, e.g. during a signal handler, does not call deferred functions, a complementary mechanism is required when the program acquires resources that are not automatically released by the operating system at program termination, e.g. SYSV shared memory. atexit is designed to work with, and complement, Go standard deferred mechanism. The Exit function provided by this package must be used, in order to run registered deferred functions. The Exit function SHOULD only be called in case of abnormal program termination.
Support
    Quality
      Security
        License
          Reuse

            kandi-support Support

              atexit has a low active ecosystem.
              It has 2 star(s) with 1 fork(s). There are 2 watchers for this library.
              OutlinedDot
              It had no major release in the last 6 months.
              atexit has no issues reported. There are no pull requests.
              It has a neutral sentiment in the developer community.
              The latest version of atexit is current.

            kandi-Quality Quality

              atexit has 0 bugs and 0 code smells.

            kandi-Security Security

              atexit has no vulnerabilities reported, and its dependent libraries have no vulnerabilities reported.
              atexit code analysis shows 0 unresolved vulnerabilities.
              There are 0 security hotspots that need review.

            kandi-License License

              atexit is licensed under the BSD-3-Clause License. This license is Permissive.
              Permissive licenses have the least restrictions, and you can use them in most projects.

            kandi-Reuse Reuse

              atexit releases are not available. You will need to build from source code and install.
              Installation instructions are not available. Examples and code snippets are available.

            Top functions reviewed by kandi - BETA

            kandi's functional review helps you automatically verify the functionalities of the libraries and avoid rework.
            Currently covering the most popular Java, JavaScript and Python libraries. See a Sample of atexit
            Get all kandi verified functions for this library.

            atexit Key Features

            No Key Features are available at this moment for atexit.

            atexit Examples and Code Snippets

            No Code Snippets are available at this moment for atexit.

            Community Discussions

            QUESTION

            Calculate the entry point of an ELF file as a physical address (offset from 0)
            Asked 2022-Mar-06 at 16:08

            I am building a RISC-V emulator which basically loads a whole ELF file into memory.

            Up to now, I used the pre-compiled test binaries that the risc-v foundation provided which conveniently had an entry point exactly at the start of the .text section.

            For example:

            ...

            ANSWER

            Answered 2022-Mar-06 at 16:08

            My question is: what is the actual "formula" of how exactly you get the entry point address of the _start procedure as an offset from byte 0?

            First, forget about sections. Only segments matter at runtime.

            Second, use readelf -Wl to look at segments. They tell you exactly which chunk of file ([.p_offset, .p_offset + .p_filesz)) goes into which in-memory region ([.p_vaddr, .p_vaddr + .p_memsz)).

            The exact calculation of "at which offset in the file does _start reside" is:

            1. Find Elf32_Phdr which "covers" the address contained in Elf32_Ehdr.e_entry.
            2. Using that phdr, file offset of _start is: ehdr->e_entry - phdr->p_vaddr + phdr->p_offset.

            Update:

            So, am I always looking for the 1st program header?

            No.

            Also by "covers" you mean that the 1st phdr->p_vaddr is always equal to e_entry?

            No.

            You are looking for a the program header (describing relationship between in-memory and on-file data) which overlaps the ehdr->e_entry in memory. That is, you are looking for the segment for which phdr->p_vaddr <= ehdr->e_entry && ehdr->e_entry < phdr->p_vaddr + phdr->p_memsz. This segment is often the first, but that is in no way guaranteed. See also this answer.

            Source https://stackoverflow.com/questions/71366471

            QUESTION

            How are non-static, non-virtual methods implemented in C++?
            Asked 2022-Mar-05 at 02:56

            I wanted to know how methods are implemented in C++. I wanted to know how methods are implemented "under the hood". So, I have made a simple C++ program which has a class with 1 non static field and 1 non static, non virtual method.

            Then I instantiated the class in the main function and called the method. I have used objdump -d option in order to see the CPU instructions of this program. I have a x86-64 processor. Here's the code:

            ...

            ANSWER

            Answered 2022-Mar-02 at 06:25

            I think what you are looking for are these instructions:

            Source https://stackoverflow.com/questions/71318184

            QUESTION

            Python not raising exception after calling start on a nested multiprocessing.Process
            Asked 2022-Feb-25 at 08:04

            I have run in to an issue in my program where exceptions are not thrown after launching a nested subprocess. That is, I have a method that I run in a multiprocessing.Process. Inside of that process ("the first process"), I launch another multiprocessing.Process. After calling start on the second process, the first process continues but does not raise exceptions, instead hanging when an exception is raised.

            I cannot tell if this is expected behavior or I have stumbled across a bug in Python. Here is a minimal example to demonstrate the issue:

            ...

            ANSWER

            Answered 2022-Feb-25 at 08:04

            Okay it seems this was probably user error on my part. I posted this question to twitter where user @strinkleydimbu1 pointed out that I could produce the expected behavior with the daemon flag. Specifically you can change this line:

            Source https://stackoverflow.com/questions/71260939

            QUESTION

            Socat hangs when piping stdin to tcp server
            Asked 2022-Feb-16 at 22:23

            I have an embedded linux system running a tcp server. Telnet can connect to and use the tcp server interactively just fine.

            I am trying to use socat to make the same connection, by linking stdin to the tcp server, like so:

            socat - tcp:localhost:8088

            I get the initial response from the server, and I can type, but as soon as I press enter, the terminal hangs (I can get out of this with Ctrl + C as long as I am not using the raw socat option.)

            If I do the same thing but with readline, everything mostly works as expected:

            socat readline tcp:localhost:8088

            However, with readline, the terminal echoes my input, and then the response from the server also echoes it. This is more than just an annoyance, since things like passwords (which should not even be echoed once) are now visible.

            Ideally, I would just use stdin instead of readline, so that I could send each character as soon as I type it, and turn off stdin echo. That way, when I type a character, the tcp server receives it and echoes it immediately, but only if it is supposed to.

            But socat is hanging with the stdin option for reasons I don't understand.

            I'm looking for an explanation as to why stdin is locking up the thread, or a workaround possibly using readline or similar.

            EDIT: Here is the dddd debug output from the socat command when I use stdin:

            sh-5.0# socat -d -d -d -d -lu - tcp:localhost:8088

            2022/02/04 01:34:58.805536 socat[1074] D getpid()

            2022/02/04 01:34:58.807631 socat[1074] D getpid() -> 1074

            2022/02/04 01:34:58.807667 socat[1074] D setenv("SOCAT_PID", "1074", 1)

            2022/02/04 01:34:58.807687 socat[1074] D setenv() -> 0

            2022/02/04 01:34:58.807704 socat[1074] D setenv("SOCAT_PPID", "1074", 1)

            2022/02/04 01:34:58.807724 socat[1074] D setenv() -> 0

            2022/02/04 01:34:58.807737 socat[1074] I socat by Gerhard Rieger and contributors - see www.dest-unreach.org

            2022/02/04 01:34:58.807752 socat[1074] I This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit. (http://www.openssl.org/)

            2022/02/04 01:34:58.807767 socat[1074] I This product includes software written by Tim Hudson (tjh@cryptsoft.com)

            2022/02/04 01:34:58.807781 socat[1074] D socat version 1.7.3.3 on May 25 2021 13:47:29

            2022/02/04 01:34:58.807795 socat[1074] D setenv("SOCAT_VERSION", "1.7.3.3", 1)

            2022/02/04 01:34:58.807811 socat[1074] D setenv() -> 0

            2022/02/04 01:34:58.807827 socat[1074] D running on Linux version #1 SMP Mon Jan 31 20:48:32 UTC 2022, release 5.4.0, machine aarch64

            2022/02/04 01:34:58.807845 socat[1074] D argv[0]: "socat"

            2022/02/04 01:34:58.807857 socat[1074] D argv[1]: "-d"

            2022/02/04 01:34:58.807870 socat[1074] D argv[2]: "-d"

            2022/02/04 01:34:58.807883 socat[1074] D argv[3]: "-d"

            2022/02/04 01:34:58.807895 socat[1074] D argv[4]: "-d"

            2022/02/04 01:34:58.807907 socat[1074] D argv[5]: "-lu"

            2022/02/04 01:34:58.807920 socat[1074] D argv[6]: "-"

            2022/02/04 01:34:58.807932 socat[1074] D argv[7]: "tcp:localhost:8088"

            2022/02/04 01:34:58.807945 socat[1074] D sigaction(1, 0xffffc8d63a18, 0x0)

            2022/02/04 01:34:58.807960 socat[1074] D sigaction() -> 0

            2022/02/04 01:34:58.807973 socat[1074] D sigaction(2, 0xffffc8d63a18, 0x0)

            2022/02/04 01:34:58.807987 socat[1074] D sigaction() -> 0

            2022/02/04 01:34:58.808000 socat[1074] D sigaction(3, 0xffffc8d63a18, 0x0)

            2022/02/04 01:34:58.808014 socat[1074] D sigaction() -> 0

            2022/02/04 01:34:58.808026 socat[1074] D sigaction(4, 0xffffc8d63a18, 0x0)

            2022/02/04 01:34:58.808040 socat[1074] D sigaction() -> 0

            2022/02/04 01:34:58.808053 socat[1074] D sigaction(6, 0xffffc8d63a18, 0x0)

            2022/02/04 01:34:58.808067 socat[1074] D sigaction() -> 0

            2022/02/04 01:34:58.808079 socat[1074] D sigaction(7, 0xffffc8d63a18, 0x0)

            2022/02/04 01:34:58.808092 socat[1074] D sigaction() -> 0

            2022/02/04 01:34:58.808105 socat[1074] D sigaction(8, 0xffffc8d63a18, 0x0)

            2022/02/04 01:34:58.808119 socat[1074] D sigaction() -> 0

            2022/02/04 01:34:58.808132 socat[1074] D sigaction(11, 0xffffc8d63a18, 0x0)

            2022/02/04 01:34:58.808146 socat[1074] D sigaction() -> 0

            2022/02/04 01:34:58.808158 socat[1074] D sigaction(15, 0xffffc8d63a18, 0x0)

            2022/02/04 01:34:58.808172 socat[1074] D sigaction() -> 0

            2022/02/04 01:34:58.808185 socat[1074] D signal(13, 0x1)

            2022/02/04 01:34:58.808200 socat[1074] D signal() -> 0x0

            2022/02/04 01:34:58.808213 socat[1074] D atexit(0xaaaaba73c4a0)

            2022/02/04 01:34:58.808226 socat[1074] D atexit() -> 0

            2022/02/04 01:34:58.808267 socat[1074] D calloc(1, 848)

            2022/02/04 01:34:58.808284 socat[1074] D calloc() -> 0xaaaadd2cc680

            2022/02/04 01:34:58.808304 socat[1074] D malloc(1024)

            2022/02/04 01:34:58.808318 socat[1074] D malloc() -> 0xaaaadd2cca00

            2022/02/04 01:34:58.808333 socat[1074] D calloc(1, 848)

            2022/02/04 01:34:58.808350 socat[1074] D calloc() -> 0xaaaadd2cce10

            2022/02/04 01:34:58.808364 socat[1074] D calloc(1, 848)

            2022/02/04 01:34:58.808377 socat[1074] D calloc() -> 0xaaaadd2cd170

            2022/02/04 01:34:58.808391 socat[1074] D isatty(0)

            2022/02/04 01:34:58.808411 socat[1074] D isatty() -> 1

            2022/02/04 01:34:58.808424 socat[1074] D tcgetattr(0, 0xaaaadd2ccf6c)

            2022/02/04 01:34:58.808461 socat[1074] D tcgetattr(, {00005400,00000005,00001cb2,0000083b, 4098,4098, 03,1c,7f,15,04,00,01,00,11,13,1a,00,12,0f,17,16,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00}) -> 0

            2022/02/04 01:34:58.808480 socat[1074] D isatty(1)

            2022/02/04 01:34:58.808494 socat[1074] D isatty() -> 1

            2022/02/04 01:34:58.808507 socat[1074] D tcgetattr(1, 0xaaaadd2cd2cc)

            2022/02/04 01:34:58.808542 socat[1074] D tcgetattr(, {00005400,00000005,00001cb2,0000083b, 4098,4098, 03,1c,7f,15,04,00,01,00,11,13,1a,00,12,0f,17,16,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00}) -> 0

            2022/02/04 01:34:59.141868 socat[1074] D malloc(128)

            2022/02/04 01:34:59.141888 socat[1074] D malloc() -> 0xaaaadd2cd4d0

            2022/02/04 01:34:59.141903 socat[1074] D malloc(128)

            2022/02/04 01:34:59.141916 socat[1074] D malloc() -> 0xaaaadd2cd560

            2022/02/04 01:34:59.141931 socat[1074] N reading from and writing to stdio

            2022/02/04 01:34:59.141946 socat[1074] D calloc(1, 848)

            2022/02/04 01:34:59.141959 socat[1074] D calloc() -> 0xaaaadd2cd5f0

            2022/02/04 01:34:59.141983 socat[1074] D malloc(1024)

            2022/02/04 01:34:59.141997 socat[1074] D malloc() -> 0xaaaadd2cd9b0

            2022/02/04 01:34:59.142015 socat[1074] D getaddrinfo("localhost", NULL, {1,0,1,6,0,0x0,0x0,0x0}, 0xffffc8d63538)

            2022/02/04 01:34:59.142789 socat[1074] D getaddrinfo(,,,{{AF=10 [0000:0000:0000:0000:0000:0000:0000:0001]:0, }) -> 0

            2022/02/04 01:34:59.142815 socat[1074] D malloc(128)

            2022/02/04 01:34:59.142830 socat[1074] D malloc() -> 0xaaaadd2ce610

            2022/02/04 01:34:59.142847 socat[1074] N opening connection to AF=2 127.0.0.1:8088

            2022/02/04 01:34:59.142861 socat[1074] I starting connect loop

            2022/02/04 01:34:59.142876 socat[1074] D socket(2, 1, 6)

            2022/02/04 01:34:59.142900 socat[1074] I socket(2, 1, 6) -> 5

            2022/02/04 01:34:59.142919 socat[1074] D fcntl(5, 2, 1)

            2022/02/04 01:34:59.142935 socat[1074] D fcntl() -> 0

            2022/02/04 01:34:59.142954 socat[1074] D connect(5, {2,AF=2 127.0.0.1:8088}, 16)

            2022/02/04 01:34:59.145199 socat[1074] D connect() -> 0

            2022/02/04 01:34:59.145246 socat[1074] D getsockname(5, 0xffffc8d635b8, 0xffffc8d6359c{112})

            2022/02/04 01:34:59.145269 socat[1074] D getsockname(, {AF=2 127.0.0.1:46294}, {16}) -> 0

            2022/02/04 01:34:59.145286 socat[1074] N successfully connected from local address AF=2 127.0.0.1:46294

            2022/02/04 01:34:59.145306 socat[1074] I resolved and opened all sock addresses

            2022/02/04 01:34:59.145321 socat[1074] D malloc(16385)

            2022/02/04 01:34:59.145344 socat[1074] D malloc() -> 0xaaaadd2cf400

            2022/02/04 01:34:59.145360 socat[1074] N starting data transfer loop with FDs [0,1] and [5,5]

            2022/02/04 01:34:59.145375 socat[1074] D data loop: sock1->eof=0, sock2->eof=0, closing=0, wasaction=1, total_to={0.000000}

            2022/02/04 01:34:59.145395 socat[1074] D select(6, &0x21, &0x22, &0x0, NULL/0.000000)

            2022/02/04 01:34:59.145426 socat[1074] D select -> (, 0x0, 0x20, 0x0, NULL/0.000000), 1

            2022/02/04 01:34:59.145443 socat[1074] D data loop: sock1->eof=0, sock2->eof=0, closing=0, wasaction=1, total_to={0.000000}

            2022/02/04 01:34:59.145461 socat[1074] D select(6, &0x21, &0x2, &0x0, NULL/0.000000)

            2022/02/04 01:34:59.157132 socat[1074] D select -> (, 0x20, 0x0, 0x0, NULL/0.000000), 1

            2022/02/04 01:34:59.157178 socat[1074] D data loop: sock1->eof=0, sock2->eof=0, closing=0, wasaction=1, total_to={0.000000}

            2022/02/04 01:34:59.157198 socat[1074] D select(2, &0x1, &0x2, &0x0, NULL/0.000000)

            2022/02/04 01:34:59.401692 socat[1074] D select -> (, 0x0, 0x2, 0x0, NULL/0.000000), 1

            2022/02/04 01:34:59.401732 socat[1074] D read(5, 0xaaaadd2cf400, 8192)

            2022/02/04 01:34:59.401765 socat[1074] D read -> 48

            2022/02/04 01:34:59.401782 socat[1074] D write(1, 0xaaaadd2cf400, 48)

            ÿûÿû

            Connect to IP address 169.254.12.16

            2022/02/04 01:34:59.401809 socat[1074] D write -> 48

            2022/02/04 01:34:59.401823 socat[1074] I transferred 48 bytes from 5 to 1

            2022/02/04 01:34:59.401838 socat[1074] D data loop: sock1->eof=0, sock2->eof=0, closing=0, wasaction=1, total_to={0.000000}

            2022/02/04 01:34:59.401856 socat[1074] D select(6, &0x21, &0x2, &0x0, NULL/0.000000)

            2022/02/04 01:34:59.462969 socat[1074] D select -> (, 0x0, 0x2, 0x0, NULL/0.000000), 1

            2022/02/04 01:34:59.463017 socat[1074] D data loop: sock1->eof=0, sock2->eof=0, closing=0, wasaction=1, total_to={0.000000}

            2022/02/04 01:34:59.463036 socat[1074] D select(6, &0x21, &0x0, &0x0, NULL/0.000000)

            At this point, I can still type, but no matter what I do, I get nothing in response.

            ...

            ANSWER

            Answered 2022-Feb-09 at 00:04

            Probably it is not Socat that hangs but the server. Use options -v -x to see what data Socat transfers in both situations and compare; maybe there are different line termination characters involved.

            Source https://stackoverflow.com/questions/71041261

            QUESTION

            Catch macos ⌘Q in python tkinter application
            Asked 2022-Jan-31 at 16:44

            eWithin a tkinter application I am catching several events to gracefully shutdown some threads within the application, before the main thread terminates. This is all working swiftly as long as I use a bound key combination or the window control, the cross in the red circle.

            On macos the application automatically gets a 'python' menu with a close function bound to key combination ⌘Q. This event is not handled properly. It seems to kill the main thread but other threads are not closed properly.

            Following bindings are used to catch all closing events:

            ...

            ANSWER

            Answered 2022-Jan-31 at 16:44

            You can catch ⌘Q with :

            Source https://stackoverflow.com/questions/69178833

            QUESTION

            Python plotting with pyqtgraph from serial port while using labels and combo boxes
            Asked 2022-Jan-23 at 10:08

            I am trying to plot telemetry data from an RC vehicle (not being specific because I want to apply this code for all kinds of projects, currently a rocket) to a computer using serial port. I want to show the COM port selection, connection status, and all kinds of data in labels and plots.

            I am trying to use pyqtgraph but it is only allowing me to place a single plot filling my window.

            How do I go about making a window that has multiple plots and labels in the same window?

            This is my code so far.

            ...

            ANSWER

            Answered 2022-Jan-23 at 10:08

            To answer Your question, You need to gather some knowledge about layouts and element positioning.
            In Your example, You are not using any layouts, only moving widgets to fixed positions in pixels. This approach might work for very limited cases, but it's strongly recommended to use Layouts.

            Here is some introduction to it.

            This will help You to make Your GUI look consistent in different windows sizes. As opposite to Your current approach, where You have to maximize Your windows size to see all the elements.

            What if someone running Your app at resolution of only 800 x 600 pixels, while Your elements occupies 1024 x 768 screen size?
            They simply won't fit to that screen.
            This issue can be solved by using layouts.

            Also have a look at very nice designer tool, which simplify the whole process of user interface creation.

            To help You in Your current situation, You must again position Your plots and resize them, as they are not inside any layout. So just as You did with Your label and Combobox, set position and size of Your plots:

            Source https://stackoverflow.com/questions/70807377

            QUESTION

            What does fs:0x30 provide in Linux?
            Asked 2022-Jan-17 at 03:21

            I am trying to understand the source code of atexit() function,but I stuck on this (line 409 ~ line 415, PTR_DEMANGLE())

            I can understand the inline asm need do a vital progress

            ...

            ANSWER

            Answered 2021-Oct-13 at 04:16

            The fs segment register is used in x86-64 Linux to point to thread-local storage. See How are the fs/gs registers used in Linux AMD64? So this instruction will xor the rdx register with the value found at offset 0x30 in the thread-local storage block.

            This code is part of a pointer encryption mechanism in glibc to help harden against certain exploits. There is some explanation of it at https://sourceware.org/glibc/wiki/PointerEncryption. The value at fs:0x30 is an "key" for a trivial "encryption" algorithm; pointers are xor'ed with this value (and then rotated) when they are stored, and rotated back and xor'ed again when they are retrieved from memory, which recovers the original pointer.

            There is no particular significance to the number 0x30; it just happens to be the offset where that value is stored. You can see in the inline assembly that this number comes from offsetof (tcbhead_t, pointer_guard); so the storage at the fs base address is laid out as a tcbhead_t struct, and given the other members that it contains, the pointer_guard member has ended up at offset 0x30. So looking at the name pointer_guard for the member is more informative than its numerical offset.

            Source https://stackoverflow.com/questions/69548334

            QUESTION

            How to make discord bot DM a user when it's offline on Replit
            Asked 2022-Jan-07 at 07:20

            I'm hosting a python discord bot on Replit.com 24/7 with a hacker plan.

            Is there a way to make the bot DM me when the code stops running by any reason?

            I've tried the atexit and signal function but it's not doing anything when I stop the code. Here's the code:

            ...

            ANSWER

            Answered 2022-Jan-07 at 07:20

            ok, so u have to add an file with flask server :

            Source https://stackoverflow.com/questions/70616538

            QUESTION

            c++: error: unrecognized command-line option ‘-target’
            Asked 2021-Nov-28 at 08:16

            Im compiling a program I made using make and I get this error

            ...

            ANSWER

            Answered 2021-Nov-28 at 08:16

            In my case, c++ was the g++ compiler instead of the clang compiler, if you are having a similar issue try updating g++ or clang++(on older macs you may need to have to use brew to install those) or going in your /usr/bin directory(for mac and linux, I never used windows cant help you) and replacing the files(though only do that if you absolutely know what your doing!).

            Source https://stackoverflow.com/questions/70139565

            QUESTION

            Address Sanitizer in MSVC: why does it report an error on startup?
            Asked 2021-Nov-01 at 11:41

            I'm trying a project that uses Qt with MSVC 2019 with Address Sanitizer. I built with Address Sanitizer the project, but didn't rebuild all libs, including Qt.

            it crashes inside Qt in resource initialization (with qRegisterResourceData in the call stack).

            Is this:

            • Misuse of address sanitizer, like, I should rebuild Qt DLLs with it too?
            • An issue in Qt I should investigate deeper?
            • Known Qt issue?

            I've recreated the issue in Widget application created by Wizard by default. The call stack is as follows:

            ...

            ANSWER

            Answered 2021-Nov-01 at 11:41

            The issue is load order.

            Qt happens to load before ASan and load C/C++ runtime before ASan DLLs loaded. Qt performs some initialization. So the memory is malloced without ASan knowledge, and later ASan sees realloc without prior malloc, which it reports.

            Building Qt with ASan should resolve the issue, I have not tried that, as I have found a workaround that does not involve Qt rebuild.

            The workaround: just make Qt DLLs import ASan DLLs. For me it is via the following commands:

            Source https://stackoverflow.com/questions/69678689

            Community Discussions, Code Snippets contain sources that include Stack Exchange Network

            Vulnerabilities

            No vulnerabilities reported

            Install atexit

            You can download it from GitHub.

            Support

            For any new features, suggestions and bugs create an issue on GitHub. If you have any questions check and ask questions on community page Stack Overflow .
            Find more information at:

            Find, review, and download reusable Libraries, Code Snippets, Cloud APIs from over 650 million Knowledge Items

            Find more libraries
            CLONE
          • HTTPS

            https://github.com/perillo/atexit.git

          • CLI

            gh repo clone perillo/atexit

          • sshUrl

            git@github.com:perillo/atexit.git

          • Stay Updated

            Subscribe to our newsletter for trending solutions and developer bootcamps

            Agree to Sign up and Terms & Conditions

            Share this Page

            share link