#
我开始研究旧的 C 代码(Unix v6),我想知道文件开头的单个的目的是什么.c
。例如来自https://github.com/lsahn-gh/unix-v6/blob/master/sys%2Fken%2Falloc.c
#
/*
*/
#include "../param.h"
#include "../systm.h"
#include "../filsys.h"
...
#
我开始研究旧的 C 代码(Unix v6),我想知道文件开头的单个的目的是什么.c
。例如来自https://github.com/lsahn-gh/unix-v6/blob/master/sys%2Fken%2Falloc.c
#
/*
*/
#include "../param.h"
#include "../systm.h"
#include "../filsys.h"
...
我想将所有 C 注释打印到单独的文本文件中。
我尝试了这些解决方案,但它在 Ubuntu 上不起作用
我的请求的目的是能够快速使用源代码注释作为良好文档的起点。我不喜欢专用文档程序的额外混乱和专有嵌入式命令(即 Doxygen)。例如,正确注释每个源代码函数并删除表面的一行注释将节省大量时间,并提供近乎完整的参考。这也将鼓励更好的源代码注释。
我的发行版是 MX Linux (Debian) GCC 已经随发行版一起安装了。
我正在尝试编译 Nir Lictman 的一些开源代码。他的Minimalist C Web 服务器代码在他的YouTube 视频中编译。
当我使用gcc编译时,出现错误:
servera.c: In function ‘main’:
servera.c:21:13: warning: passing argument 2 of ‘bind’ from incompatible pointer type [-Wincompatible-pointer-types]
21 | bind(s, &addr, sizeof(addr));
| ^~~~~
| |
| struct sockaddr_in *
In file included from servera.c:1:
/usr/include/x86_64-linux-gnu/sys/socket.h:112:49: note: expected ‘const struct sockaddr *’ but argument is of type ‘struct sockaddr_in *’
112 | extern int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)
当我尝试查看 netinet 的手册页时,出现错误:
$ man netinet
No manual entry for netinet
我确实找到了一个netinet
包含in.h
at的目录/usr/include/netinet
。其in.h
定义sockaddr_in
如下:
/* Structure describing an Internet socket address. */
struct sockaddr_in
{
__SOCKADDR_COMMON (sin_);
in_port_t sin_port; /* Port number. */
struct in_addr sin_addr; /* Internet address. */
/* Pad to size of `struct sockaddr'. */
unsigned char sin_zero[sizeof (struct sockaddr)
- __SOCKADDR_COMMON_SIZE
- sizeof (in_port_t)
- sizeof (struct in_addr)];
};
不过我想知道编译器是否找到了这个定义。
MB_CUR_MAX
被 glibc 定义为“一个正整数表达式,它是当前语言环境中多字节字符的最大字节数”。
如果我打印我得到的值1
。我认为这是因为 CC
默认使用区域设置,即使我系统的区域设置是en_US.UTF-8
.
如果我添加setlocale(LC_ALL, "")
到我的程序中,它应该启用使用环境的区域设置,然后MB_CUR_MAX
变成6
.
现在我的问题是,为什么是 6?UTF-8 不是每个代码点有 1 到 4 个字节的编码吗?
来源:https://git.postgresql.org/cgit/postgresql.git/tree/src/backend/optimizer/plan/planner.c
(gdb) n
3556 if (root->group_pathkeys)
(gdb) s
3558 else if (root->window_pathkeys)
(gdb) print root->group_pathkeys==NULL
No symbol "NULL" in current context.
(gdb) s
3559 root->query_pathkeys = root->window_pathkeys;
(gdb) s
query_planner (root=root@entry=0x55ffb53fdb70, qp_callback=qp_callback@entry=0x55ffb3299ee0 <standard_qp_callback>, qp_extra=qp_extra@entry=0x7ffc5db45260) at ../../Desktop/pg_sources/main/postgres/src/backend/optimizer/plan/planmain.c:219
219 fix_placeholder_input_needed_levels(root);
根据上面的内容,我可以猜测root->group_pathkeys == NULL
并且root->query_pathkeys != NULL
可以使用 print 来评估表达式。类似于print (root->group_pathkeys==NULL)
然后返回 1。
我有一个使用 msqllib 的程序。它扫描我构建的一些硬件,然后更新 mysql 数据库。这个程序已经运行了很多年,但我从来没有能够在系统重新启动时自动启动它。现在我遇到了一个我无法控制的电源循环问题,所以想让它自动运行。
在 rc.local 中:我有:
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
/home/nigel/scan
exit 0
现在,当我在命令提示符下输入代码并更新我的数据库时,代码运行良好。但是,当我把它放在 rc.local 中时, ps -ef
显示:
root 356 350 0 20:54 ? 00:00:03 /home/nigel/scan
但是程序没有执行更新数据库的 SQL 调用。
如果我询问 rc.local 的状态:
root@Pi-Scan:~# systemctl status rc-local.service
● rc-local.service - /etc/rc.local Compatibility
Loaded: loaded (/lib/systemd/system/rc-local.service; enabled-runtime; vendor preset: enabled)
Drop-In: /usr/lib/systemd/system/rc-local.service.d
└─debian.conf
/etc/systemd/system/rc-local.service.d
└─ttyoutput.conf
Active: activating (start) since Sat 2023-05-06 20:54:19 EDT; 12min ago
Docs: man:systemd-rc-local-generator(8)
Cntrl PID: 350 (rc.local)
Tasks: 2 (limit: 414)
CPU: 3.903s
CGroup: /system.slice/rc-local.service
├─350 /bin/sh -e /etc/rc.local start
└─356 /home/nigel/scan
May 06 20:54:21 Pi-Scan rc.local[356]: error: first parameter is not a valid address family: Transport endpoint is not connected
May 06 20:54:22 Pi-Scan rc.local[356]: error: first parameter is not a valid address family: Transport endpoint is not connected
May 06 20:54:23 Pi-Scan rc.local[356]: error: first parameter is not a valid address family: Transport endpoint is not connected
May 06 20:54:24 Pi-Scan rc.local[356]: error: first parameter is not a valid address family: Transport endpoint is not connected
May 06 20:54:25 Pi-Scan rc.local[356]: error: first parameter is not a valid address family: Transport endpoint is not connected
May 06 20:54:26 Pi-Scan rc.local[356]: error: first parameter is not a valid address family: Transport endpoint is not connected
May 06 20:54:27 Pi-Scan rc.local[356]: error: first parameter is not a valid address family: Transport endpoint is not connected
May 06 20:54:28 Pi-Scan rc.local[356]: error: first parameter is not a valid address family: Transport endpoint is not connected
但是,如果我发出systemctl restart rc-local.service
该程序执行第二个实例并且工作正常!
考虑到这可能是赛车条件,我尝试在命令前添加一个 sleep 5,但仍然遇到同样的问题。
我在基于 yocto 的 Linux 发行版上工作。我不是专家systemd
,也不是systemd-journald
.
我的 C 程序my_c_program
在启动时由脚本启动my_script.sh
。下面是文件my_script.sh
:
my_c_program &
echo $! > /dev/shm/my_c_program.pid
以前的脚本由服务启动。服务的单元文件称为start_c_program.service
. 下面是单元服务:
[Unit]
Description=Start my_c_program
Requires=...
After=...
Before=...
[Service]
Type=forking
ExecStart=/usr/bin/my_script.sh
PIDFile=/dev/shm/my_c_program.pid
[Install]
WantedBy=multi-user.target
使用此配置,所有指令都printf("message")
将my_c_program
字符串添加"message"
到systemd-journald
. 我知道如果我修改my_script.sh
为:
my_c_program > /dev/null &
echo $! > /dev/shm/my_c_program.pid
on 上的消息journald
被抑制,但问题是:
为什么我的 C 程序的所有输出都指向 stdout 被发送到journald
?
谢谢
我在想,要向我发送消息,journald
我必须使用 C 指令syslog()
,例如通过如下代码:
#include<syslog.h>
int main(int argc, char** argv) {
syslog(LOG_INFO, "Start logging");
}
我知道子进程将返回 0,而父进程将返回子进程的 PID 值。但是,如果调用多个 fork() 函数,子进程(或分叉 >= 2 次的进程)的子进程的返回值是多少?例如在:
int main()
{
Fork();
Fork();
printf("hello\n");
exit(0);
}
fork() 被调用了两次,因此子进程也将继续分叉。那么对此,从子进程中fork出来的进程会不会全部归0呢?任何帮助将不胜感激。
#ifdef HAVE_UNISTD_H
#include<unistd.h>
#else
extern int getpid(void)
#endif /* HAVE_UNISTD_H */
我想这个想法是检查头文件<unistd.h>
是否可用。如果没有,那么extern int getpid(void)
我知道这是非常基本的。但是我没有通过互联网找到好的结果。HAVE_UNISTD_H 宏是什么意思?