{"id":1414,"date":"2024-07-24T15:36:48","date_gmt":"2024-07-24T07:36:48","guid":{"rendered":"https:\/\/swordofmorning.com\/?p=1414"},"modified":"2025-10-09T13:54:44","modified_gmt":"2025-10-09T05:54:44","slug":"rv1126-04","status":"publish","type":"post","link":"https:\/\/swordofmorning.com\/index.php\/2024\/07\/24\/rv1126-04\/","title":{"rendered":"RV1126 \u8fdb\u4e00\u6b65\u7684\u9a71\u52a8\u7a0b\u5e8f"},"content":{"rendered":"<p>&emsp;&emsp;\u5728\u672c\u7ae0\u4e2d\uff0c\u6211\u4eec\u5c06\u7f16\u5199\u4e00\u4e2a\u53ef\u4ee5\u63a5\u53d7\u4e24\u4e2a<code>int<\/code>\u578b\u53c2\u6570\u548c\u4e00\u4e2a<code>char<\/code>\u578b\u53c2\u6570\u7684\u9a71\u52a8\uff0c\u5e76\u6839\u636e<code>char<\/code>\u7684\u7c7b\u578b\u2014\u2014<code>+<\/code>\u6216\u8005<code>-<\/code>\u2014\u2014\u6765\u8ba1\u7b97\u7ed3\u679c\uff0c\u5e76\u6700\u7ec8\u53ef\u4ee5\u901a\u8fc7<code>read<\/code>\u8fd4\u56de\u8fd9\u4e00\u7ed3\u679c\u3002<\/p>\n<h2>\u4e00\u3001\u9a71\u52a8\u7a0b\u5e8f<\/h2>\n<pre><code class=\"language-c\">#include &lt;linux\/module.h&gt;\n#include &lt;linux\/fs.h&gt;\n#include &lt;linux\/uaccess.h&gt;\n#include &lt;linux\/init.h&gt;\n#include &lt;linux\/miscdevice.h&gt;\n#include &lt;linux\/types.h&gt;\n\n#define DEVICE_NAME &quot;my_calc&quot;\n\nstatic int result;\n\nstatic ssize_t my_driver_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)\n{\n    char result_str[16];\n    int len;\n\n    if (*ppos &gt; 0)\n        return 0;\n\n    len = snprintf(result_str, sizeof(result_str), &quot;%d\\n&quot;, result);\n\n    if (count &lt; len)\n        return -EINVAL;\n\n    if (copy_to_user(buf, result_str, len))\n        return -EFAULT;\n\n    *ppos = len;\n    return len;\n}\n\nstatic ssize_t my_driver_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)\n{\n    uint32_t a, b;\n    uint8_t symbol;\n\n    if (count != sizeof(uint32_t) * 2 + sizeof(uint8_t))\n        return -EINVAL;\n\n    if (copy_from_user(&amp;a, buf, sizeof(uint32_t)))\n        return -EFAULT;\n\n    if (copy_from_user(&amp;b, buf + sizeof(uint32_t), sizeof(uint32_t)))\n        return -EFAULT;\n\n    if (copy_from_user(&amp;symbol, buf + 2 * sizeof(uint32_t), sizeof(uint8_t)))\n        return -EFAULT;\n\n    switch (symbol) {\n        case &#039;+&#039;:\n            result = a + b;\n            break;\n        case &#039;-&#039;:\n            result = a - b;\n            break;\n        default:\n            return -EINVAL;\n    }\n\n    return count;\n}\n\nstatic const struct file_operations my_driver_fops = {\n    .owner = THIS_MODULE,\n    .read = my_driver_read,\n    .write = my_driver_write,\n};\n\nstatic struct miscdevice my_driver_device = {\n    .minor = MISC_DYNAMIC_MINOR,\n    .name = DEVICE_NAME,\n    .fops = &amp;my_driver_fops,\n};\n\nstatic int __init my_driver_init(void)\n{\n    int ret;\n\n    ret = misc_register(&amp;my_driver_device);\n    if (ret)\n        pr_err(&quot;Failed to register misc device\\n&quot;);\n\n    return ret;\n}\n\nstatic void __exit my_driver_exit(void)\n{\n    misc_deregister(&amp;my_driver_device);\n}\n\nmodule_init(my_driver_init);\nmodule_exit(my_driver_exit);\n\nMODULE_LICENSE(&quot;GPL&quot;);\nMODULE_AUTHOR(&quot;Author&quot;);\nMODULE_DESCRIPTION(&quot;A simple calculator driver&quot;);<\/code><\/pre>\n<h2>\u4e8c\u3001\u5e94\u7528\u7a0b\u5e8f<\/h2>\n<pre><code class=\"language-cpp\">#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;fcntl.h&gt;\n#include &lt;unistd.h&gt;\n#include &lt;cstring&gt;\n\n#define DEVICE_PATH &quot;\/dev\/my_calc&quot;\n\nint main(int argc, char *argv[])\n{\n    int fd;\n    int a, b, result;\n    char symbol;\n    char buffer[16];\n    char write_buffer[9];\n\n    if (argc != 4) {\n        fprintf(stderr, &quot;Usage: %s &lt;a&gt; &lt;b&gt; &lt;symbol&gt;\\n&quot;, argv[0]);\n        exit(EXIT_FAILURE);\n    }\n\n    a = atoi(argv[1]);\n    b = atoi(argv[2]);\n\n    symbol = argv[3][0];\n\n    if (symbol != &#039;+&#039; &amp;&amp; symbol != &#039;-&#039;) {\n        fprintf(stderr, &quot;Invalid symbol. Use &#039;+&#039; or &#039;-&#039;.\\n&quot;);\n        exit(EXIT_FAILURE);\n    }\n\n    fd = open(DEVICE_PATH, O_RDWR);\n    if (fd == -1) {\n        perror(&quot;Failed to open device&quot;);\n        exit(EXIT_FAILURE);\n    }\n\n    \/\/ \u5c06\u6570\u636e\u6253\u5305\u5230 write_buffer \u4e2d\n    memcpy(write_buffer, &amp;a, sizeof(int));\n    memcpy(write_buffer + sizeof(int), &amp;b, sizeof(int));\n    memcpy(write_buffer + 2 * sizeof(int), &amp;symbol, sizeof(char));\n\n    \/\/ \u4e00\u6b21\u6027\u5199\u5165\u6240\u6709\u6570\u636e\n    if (write(fd, write_buffer, sizeof(write_buffer)) != sizeof(write_buffer)) {\n        perror(&quot;Failed to write data to device&quot;);\n        close(fd);\n        exit(EXIT_FAILURE);\n    }\n\n    if (read(fd, buffer, sizeof(buffer)) == -1) {\n        perror(&quot;Failed to read result from device&quot;);\n        close(fd);\n        exit(EXIT_FAILURE);\n    }\n\n    result = atoi(buffer);\n\n    printf(&quot;%d %c %d = %d\\n&quot;, a, symbol, b, result);\n\n    close(fd);\n    return 0;\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>&emsp;&emsp;\u5728\u672c\u7ae0\u4e2d\uff0c\u6211\u4eec\u5c06\u7f16\u5199\u4e00\u4e2a\u53ef\u4ee5\u63a5\u53d7\u4e24\u4e2aint\u578b\u53c2\u6570\u548c\u4e00\u4e2achar\u578b\u53c2\u6570\u7684\u9a71\u52a8\uff0c\u5e76\u6839\u636echar\u7684\u7c7b\u578b\u2014\u2014+\u6216\u8005 &#8230;<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[46],"tags":[303],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/posts\/1414"}],"collection":[{"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/comments?post=1414"}],"version-history":[{"count":1,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/posts\/1414\/revisions"}],"predecessor-version":[{"id":1415,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/posts\/1414\/revisions\/1415"}],"wp:attachment":[{"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/media?parent=1414"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/categories?post=1414"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/tags?post=1414"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}