- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 Unix 命令环境中编写 C shell。到目前为止,一切都按标准运行,但是以下命令将导致我的代码正确执行,但以段错误终止
1. ls | ls | ls
2. ls -al | ls -al > output.txt
底线:我相信段错误来自“XXXX 从这里开始”和“XXXX 从这里结束”之间的行。我还相信它与第一个 while 循环中的 getchar 测试有关,尽管我可能是错的。如果编译并运行此代码,您将在输入“ls -al | ls -al > output.txt”时看到所有内容都将执行,然后打印 shhh> AAAAA,然后是 seg 错误。谁能证实或否认我最初的观察?
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <fcntl.h>
main()
{
char *path, *argv[20], buf[80], n, *p;
int m, status, inword, continu;
int inFlag, outFlag, bgFlag, k, count, j, pipes, pid, aCount, dirCount,
hCount;
int r_tube[2], l_tube[2];
char *hist;
char *h1[20] = { 0 };
aCount = 0;
dirCount = 0;
while (1)
{
inword = 0;
p = buf;
m = 0;
continu = 0;
inFlag = outFlag = bgFlag = k = count = j = pipes = pid = 0;
hCount = 0;
int loc[20] = { 0 };
char currD[50];
printf("\nshhh> ");
while ((n = getchar()) != '\n' || continu) //XXXXXXXXX Starts here
{
if (n == ' ')
{
if (inword)
{
inword = 0;
*p++ = 0;
}
}
else if (n == '\n')
continu = 0;
else if (n == '\\' && !inword)
continu = 1;
else
{
if (!inword)
{
inword = 1;
argv[m++] = p;
*p++ = n;
}
else
*p++ = n;
}
} //XXXXXXXX Ends here
*p++ = 0;
argv[m] = 0;
getcwd(currD, 50);
while (argv[k] != 0)
{ //stores all entered commands into history array
h1[aCount] = strdup(argv[k]);
aCount++;
k++;
}
k = 0;
if ((strcmp(argv[0], "history") == 0) ||
(strcmp(argv[0], "History") == 0))
{ //tests to see if history is asked for
printf("History: \n");
for (k = 0; k < aCount; k++)
printf("%s\n", h1[k]);
}
if (strcmp(argv[0], "cd") == 0)
{ //tests to see if CD is needed
if (strcmp(argv[1], "..") == 0)
chdir(currD);
else
{
while (argv[dirCount] != 0)
{
getcwd(currD, 50);
chdir(argv[dirCount]);
dirCount++;
}
}
}
char *outFile = NULL;
char *inFile = NULL;
loc[0] = 0;
while (argv[count] != 0)
{ //while loop sets the flags for input redirection,
// output redirection, background operator, and piping
if (strcmp(argv[count], "<") == 0)
{
inFile = strdup(argv[count + 1]);
argv[count] = argv[count + 1] = 0;
inFlag = 1;
}
else if (strcmp(argv[count], ">") == 0)
{
outFile = strdup(argv[count + 1]);
argv[count] = argv[count + 1] = 0;
outFlag = 1;
}
else if (strcmp(argv[count], "&") == 0)
{
argv[count] = 0;
bgFlag = 1;
}
else if (strcmp(argv[count], "|") == 0)
{
argv[count] = 0;
loc[pipes + 1] = count + 1;
pipes++;
printf("LOC0: %d ", loc[0]);
printf("LOC1: %d ", loc[1]);
printf("LOC2: %d ", loc[2]);
printf("DONE WITH IF\n");
}
else
loc[count] = count;
count++;
}
for (k = 0; k <= pipes; k++)
{ //actual execution of commands
printf("IN FOR\n");
if (k < pipes)
{
pipe(r_tube);
j++;
}
pid = fork(); //fork child every time to exec
if (pid > 0)
{
if (j > 0)
{
close(l_tube[0]);
close(l_tube[1]);
}
l_tube[0] = r_tube[0];
l_tube[1] = r_tube[1];
}
else if (pid == 0)
{
if ((k == 0) && (inFlag == 1))
{
int n = open(inFile, O_RDONLY | O_CREAT);
if (n == -1)
{
printf("Couldn't open inFile!\n");
exit(1);
}
close(0);
dup(n);
close(n);
}
else if ((k == pipes) && (outFlag == 1))
{
int out = open(outFile, O_WRONLY | O_CREAT, 0666);
if (out < 0)
{
printf("Could'nt open outFile!\n");
exit(1);
}
close(1);
dup(out);
close(out);
}
printf("K: %d ", k);
printf("PIPES: %d ", pipes);
printf("PID: %d\n", pid);
execvp(argv[loc[k]], &argv[loc[k]]);
}
printf("ONE\n");
if (bgFlag == 0)
wait(NULL);
}
printf("TWO\n");
if (strcmp(argv[0], "quit") == 0)
exit(0); //tests for exit/quit to end program
if (strcmp(argv[0], "exit") == 0)
exit(0);
printf("THREE\n");
for (k = 0; k < 20; k++) //reset all of argv to NULL
argv[k] = 0;
printf("FOUR\n");
wait(&status);
}
}
最佳答案
处理段错误的最简单方法是分析保存到内核生成的 coredump 中的堆栈跟踪。大多数发行版都禁用了核心转储保存,因此如何启用它
ulimit -c unlimited
Proc 文件系统有几个文件来配置 corudump 生产。最重要的是core pattern /proc/sys/kernel/core_pattern
,指定 coredump 名称和可选的后处理命令。
当进程收到段错误信号时,内核会将其状态保存在 coredump 文件中,稍后可以使用 dgb 检查该文件。 :
gdb -c core ./binary_which_produced_the_core
bt
这将打印出发生段错误时程序正在执行的操作的回溯。
例如,对于您的程序
Program terminated with signal 11, Segmentation fault.
#0 main () at main.c:58
58 *p++ = n;
(gdb) bt
#0 main () at main.c:58
(gdb)
注意,我必须添加缺少的 header ,因此行号为 +2。
请使用 -Wall -Wextra
编译器选项来报告所有警告并始终修复它们。例如,您的 l_tube 数组未初始化。
关于c - 自定义 C Shell 中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13095978/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!