Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Linux上使用crontab运行我自己的C程序时出现分段错误_C_Linux_Cron_Segmentation Fault - Fatal编程技术网

在Linux上使用crontab运行我自己的C程序时出现分段错误

在Linux上使用crontab运行我自己的C程序时出现分段错误,c,linux,cron,segmentation-fault,C,Linux,Cron,Segmentation Fault,联阿援助团-a: Linux deepin 5.4.70-amd64-desktop #1 SMP Wed Oct 14 15:24:23 CST 2020 x86_64 GNU/Linux 我正在写一个C程序,它可以处理目录和套接字。当我通过命令行运行它时,它会按预期工作,但当通过cron运行时,它会出现分段错误 这是我课程的切入点(我想也是相关部分) PS:我尝试@reboot,但改为*****为'debug'。使用@reboot并检查日志时,也会出现分段错误。检查/var/mail/us

联阿援助团-a:

Linux deepin 5.4.70-amd64-desktop #1 SMP Wed Oct 14 15:24:23 CST 2020 x86_64 GNU/Linux
我正在写一个C程序,它可以处理目录和套接字。当我通过命令行运行它时,它会按预期工作,但当通过cron运行时,它会出现分段错误

这是我课程的切入点(我想也是相关部分)

PS:我尝试@reboot,但改为*****为'debug'。使用@reboot并检查日志时,也会出现分段错误。检查/var/mail/user,它显示:

Content-Transfer-Encoding: 8bit
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/user>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=user>
Message-Id: <20210304184201.5A18124898@deepin>
Date: Thu,  4 Mar 2021 15:27:02 -0300 (-03)

Segmentation fault
内容传输编码:8比特
X-Cron-Env:
X-Cron-Env:
X-Cron-Env:
X-Cron-Env:
消息Id:
日期:2021年3月4日星期四15:27:02-0300(-03)
分段故障

编辑1:我已经尝试(在主功能的顶部)放置一个函数,该函数创建一个文件,然后写入并保存。此函数从不执行。我创建了另一个程序,它只有一个主函数,可以写入文件并保存。将二进制文件放在myprogram的同一文件夹中,并为其装入一个cron,它可以正常执行(我可以看到生成的文件,并且日志上没有显示segfault或其他错误)。

我认为问题可能由各种问题引起:

为什么需要在循环中连接到服务器

while (1) {
        int16_t server_socket = connect_to_server();

        start_communication(server_socket);
    }
    return 0;
或许应该是:

int16_t server_socket=connect_to_server();
而(1){
启动\u通信(服务器\u套接字);
}
返回0;

而不是:

free(safe_exec_filename);
使用:


同时使用cron和c程序打印
safe\u exec\u filename
,查看是否有差异,segfault的程序集如下所示:

Mar  4 15:27:01 deepin CRON[14713]: (user) CMD (/home/user/.local/bin/myprogram)
Mar  4 15:27:01 deepin kernel: [ 5934.175052] myprogram[22332]: segfault at 0 ip 00007f4fb5cea327 sp 00007ffd74362328 error 4 in libc-2.28.so[7f4fb5c6f000+148000]
Mar  4 15:27:01 deepin kernel: [ 5934.175060] Code: 0f 7f 27 f3 0f 7f 6f 10 f3 0f 7f 77 20 48 83 c6 30 48 83 c7 30 4c 8d 1d 47 f7 0d 00 49 63 0c 93 49 8d 0c 0b ff e1 66 0f ef c0 <f3> 0f 6f 0e f3 0f 6f 56 10 66 0f 74 c1 66 0f d7 d0 48 85 d2 75 6b

您的字符数组太小: 因此,我主要担心的是,它可能与目标路径的缓冲区有关,该缓冲区变得太小,因为cron使用的是相对路径而不是绝对路径:

strcat(目的地路径,执行文件名);
尝试更改缓冲区大小:

#define SIZE 2048
char    destination_path[SIZE] = { 0 };
并添加一张支票:

if((strlen(exec_文件名)+strlen(destination_路径))>SIZE)
{错误处理}
strcat(目标路径、执行文件名);

当您从shell运行程序时,它设置了许多环境变量,这些变量在从cron运行时可能存在,也可能不存在<代码>用户就是其中之一。您应该检查系统的文档,但是:

cron(8)守护进程会自动设置多个环境变量。SHELL设置为/bin/sh,LOGNAME和HOME是从crontab所有者的/etc/passwd行设置的。HOME和SHELL可能会被crontab中的设置覆盖;LOGNAME可能不会

(另请注意:在BSD系统上,LOGNAME变量有时称为USER…在这些系统上,还将设置USER。)

因此,
用户
可能未定义。如果不是,则
getenv(“USER”)
将返回NULL,但您不进行此测试,因此
username
将为NULL,并在将其传递给
sprintf
时进行segfault

您可以改为使用
LOGNAME
,或者跳过环境变量,使用类似
getpwuid(getuid())
的内容查找用户名


在任何情况下,更多的错误检查通常都是一个好主意,以防止更多此类错误。

尝试在valgrind下运行代码。如果内存管理不正确,它会告诉您在哪里。通过命令行运行valgrind和
--leak check=full
,不会显示任何错误,程序会进入
recv
(如预期)。我不知道如何和克朗特拉布一起经营valgrind,解决了这个问题。感谢@Nate Eldredge。如何避免出现
代码无目的
警告(关于出现第一个语句e
argc;
)?您的程序无法测试。请阅读。我需要在循环中连接,因为如果通信发生错误,客户端将继续尝试连接到服务器。对数组大小进行了更改并添加了一些打印。在命令行上运行正常,但使用cron时,seg故障不断发生。我在crontab上使用了:****/home/user/.local/bin/myprogram&>/home/user/Desktop/output.txt来捕获stdout和err,但没有写入文件。使用了
getpwuid(getuid())
而不是使用环境变量,现在一切正常,谢谢!答案被接受。
free(safe_exec_filename);
if (safe_exec_filename == NULL) {
    dprintf(2, "Safe exec filename is NULL");
    return 1;
}
free(safe_exec_filename);
0:  0f 7f 27                movq   QWORD PTR [edi],mm4
3:  f3 0f 7f 6f 10          movdqu XMMWORD PTR [edi+0x10],xmm5
8:  f3 0f 7f 77 20          movdqu XMMWORD PTR [edi+0x20],xmm6
d:  48                      dec    eax
e:  83 c6 30                add    esi,0x30
11: 48                      dec    eax
12: 83 c7 30                add    edi,0x30
15: 4c                      dec    esp
16: 8d 1d 47 f7 0d 00       lea    ebx,ds:0xdf747
1c: 49                      dec    ecx
1d: 63 0c 93                arpl   WORD PTR [ebx+edx*4],cx
20: 49                      dec    ecx
21: 8d 0c 0b                lea    ecx,[ebx+ecx*1]
24: ff e1                   jmp    ecx
26: 66 0f ef c0             pxor   xmm0,xmm0
2a: f3 0f 6f 0e             movdqu xmm1,XMMWORD PTR [esi]
2e: f3 0f 6f 56 10          movdqu xmm2,XMMWORD PTR [esi+0x10]
33: 66 0f 74 c1             pcmpeqb xmm0,xmm1
37: 66 0f d7 d0             pmovmskb edx,xmm0
3b: 48                      dec    eax
3c: 85 d2                   test   edx,edx
3e: 75 6b                   jne    0xab
#define SIZE 2048
char    destination_path[SIZE] = { 0 };