- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我对以下代码有疑问。它就像在 Unix 平台上使用 C 的手动 shell 程序实现。如果用户输入命令,它应该执行并返回相应的结果。如果用户在末尾输入“&
”,则父进程无需等待子进程完成。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#define HISTORY_LIMIT 20
#define BUFFER_LIMIT 100
#define MAX_WORDS 50
int count = 0;
char history[HISTORY_LIMIT][BUFFER_LIMIT];
int tokenize(char *str, char **args, int *bRun)
{
int i, argc = 0;
char *token;
if (count == HISTORY_LIMIT)
{
// alignHistory();
}
// strcpy(history[count],str);
count++;
token = strtok(str, " \t\n");
for (i = 0; token != NULL; i++)
{
args[i] = token;
token = strtok(NULL, " \t\n");
argc++;
}
for (i = 0; i < argc; i++)
{
if (strcmp(args[i], "&") == 0)
{
*bRun = 1;
args[i] = NULL;
}
}
return argc;
} // end of tokenize function
void handleSignal(int sign)
{
if (sign == SIGINT)
{
// getHistory();
}
} // end of handlesignal
int main(void)
{
char *args[MAX_WORDS];
char buffer[BUFFER_LIMIT];
pid_t pid;
int argc;
int bgRun = 0;
if (signal(SIGINT, handleSignal) == SIG_ERR)
{
printf("can't handle ctrl-c");
return 0;
}
while (1)
{
bgRun = 0;
memset(args, 0, MAX_WORDS);
printf("osh>");
fgets(buffer, BUFFER_LIMIT, stdin);
argc = tokenize(buffer, args, &bgRun);
if (argc == 0)
continue;
if (strcmp(args[0], "exit") == 0)
break;
if (strcmp(args[0], "history") == 0)
getHistory();
// else if(strcmp(args[0],"hello")==0)printf("Hi There, How are you ?\n");
else
{
pid = fork();
if (pid == 0)
{
execvp(args[0], args);
return 0;
}
else
{
if (bgRun == 0)
wait(NULL);
}
}
}
}
输出是:
osh>whoami
root
osh>whoami &
osh>root
whoami
osh>root
但是要求的结果应该是这样的(如果命令中使用了&)
osh>whoami
root
osh>whoami &
osh>root
whoami
root
osh>
所以我使用了 bgRun
int 变量并在命令有 1 时赋值为 1但那是行不通的。我认为这是 wait(NULL)
的问题。请救我脱离这个恶魔。
最佳答案
您没有说要等待哪个子进程,因此当第二个 命令退出时,第三个命令(不应该在后台执行)被认为已完成。
糟糕。
您需要处理 SIGCHLD
并在它们终止时获取后台进程,并检查退出的进程是否是您当前正在“前台”运行的进程,而不是正在完成的后台作业。 waitpid()
允许您等待特定进程。
关于c - wait(NULL) 函数不起作用,父进程总是在子进程之前运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32597332/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!