- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试在 OS X 上使用 Make 编译 C 程序,但收到错误消息。
#define _XOPEN_SOURCE // required for cuserid to work
// includes
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/resource.h>
#include <time.h>
// user-defined constants
#define FIB_MAX_ITERS 20
#define SLEEP_LENGTH 2
// Prints an error message and exits if one occurs. Else, returns the system call value.
int print_if_err(int syscall_val)
{
if (syscall_val < 0) {
perror("fork");
exit(errno);
} else {
// No syscall error; we can return.
return syscall_val;
}
}
char* cuserid_wrapper()
{
char* val = cuserid(NULL);
if (val == NULL) {
perror("cuserid");
exit(errno);
} else {
return val;
}
}
time_t time_wrapper()
{
time_t val = time(NULL);
if (val == ((time_t) -1)) {
perror("time_wrapper");
exit(errno);
} else {
return val;
}
}
void getrusage_wrapper(struct rusage* output)
{
int val = getrusage(RUSAGE_SELF, output);
if (val == -1){
perror("getrusage_wrapper");
exit(errno);
}
}
void print_uids_gids(const char* proc_name)
{
printf("[%s] username: %s\n", proc_name, cuserid_wrapper());
// According to man pages, following syscalls always succeed.
// Hence, no error checking
printf("[%s] user id: %d\n", proc_name, getuid());
printf("[%s] effective user id: %d\n", proc_name, geteuid());
printf("[%s] group id: %d\n", proc_name, getgid());
printf("[%s] effective group id: %d\n", proc_name, getegid());
printf("[%s] pid: %d\n", proc_name, getpid());
}
void print_exec_times(const char* proc_name)
{
// build up some cpu time
int k = 0;
int i;
for (i = 0; i < 100000000; i++) {
k += 2;
}
time_t cur_time;
struct rusage res_usage;
cur_time = time_wrapper();
getrusage_wrapper(&res_usage);
printf("[%s] seconds since epoch: %d\n", proc_name, (int)cur_time);
printf("[%s] current time: %s", proc_name, ctime(&cur_time));
printf("[%s] user CPU time: %d us\n", proc_name, (int)res_usage.ru_utime.tv_usec);
printf("[%s] system CPU time: %d us\n", proc_name, (int)res_usage.ru_stime.tv_usec);
}
void sleep_wrapper(unsigned int length)
{
int time_left = length;
while (time_left > 0) {
time_left = sleep(length);
}
}
char* getcwd_wrapper()
{
char* cwd = getcwd(NULL, 0);
if (cwd == NULL) {
perror("getcwd_wrapper");
exit(errno);
} else {
return cwd;
}
}
void waitpid_wrapper(pid_t pid)
{
int status;
int val = waitpid(pid, &status, 0);
if (val == -1) {
perror("waitpid_wrapper");
exit(errno);
}
}
void child_proc(int fib_start, const char* proc_name)
{
print_uids_gids(proc_name);
// No errors can occur for getppid
printf("[%s] parent PID: %d\n", proc_name, getppid());
sleep(SLEEP_LENGTH); // sleep to align fibonacci prints
// main loop - printing fibonacci numbers
int f_prev = 1; // starts at f_1
int f_cur = 1; // starts at f_2
int f_cur_new;
int f_prev_new;
int i;
for (i = fib_start; i <= FIB_MAX_ITERS; i += 2) { // want <= b/c 1-based index
if (i % 2 == 1) {
printf("[%s] f_%d = %d\n", proc_name, i, f_prev);
} else if (i % 2 == 0) {
printf("[%s] f_%d = %d\n", proc_name, i, f_cur);
}
f_cur_new = 2 * f_cur + f_prev;
f_prev_new = f_cur + f_prev;
f_cur = f_cur_new;
f_prev = f_prev_new;
sleep(SLEEP_LENGTH);
}
print_exec_times(proc_name);
exit(0);
}
char* get_proc_name(const char* base, char* buff)
{
sprintf(buff, "%s, PID=%d", base, (int)getpid());
return (char*)buff;
}
int main(void)
{
char parent_proc_name[255];
get_proc_name("parent", parent_proc_name);
// TODO: Error check the syscalls!
printf("[%s] current working directory: %s\n", parent_proc_name, getcwd_wrapper());
print_uids_gids(parent_proc_name);
pid_t child1_pid = print_if_err(fork());
if (child1_pid == 0) {
sleep(SLEEP_LENGTH / 2);
char proc_name[255];
get_proc_name("child1", proc_name);
child_proc(1, proc_name);
}
printf("[%s] child1_pid: %d\n", parent_proc_name, child1_pid);
pid_t child2_pid = print_if_err(fork());
if (child2_pid == 0) {
sleep(SLEEP_LENGTH);
char proc_name[255];
get_proc_name("child2", proc_name);
child_proc(2, proc_name);
}
printf("[%s] child2_pid: %d\n", parent_proc_name, child1_pid);
int status;
// TODO: Error check the syscalls!
waitpid(child1_pid, &status, 0);
printf("[%s] child1 terminated\n", parent_proc_name);
waitpid(child2_pid, &status, 0);
printf("[%s] child2 terminated\n", parent_proc_name);
print_exec_times(parent_proc_name);
return 0;
}
CC = gcc
C_FLAGS = -Wall -Wextra
all: eecs338_hw01
eecs338_hw01: eecs338_hw01.o
$(CC) eecs338_hw01.o -o eecs338_hw01
eecs338_hw01.o: eecs338_hw01.c
$(CC) -c $(C_FLAGS) eecs338_hw01.c
clean:
rm -f eecs338_hw01 eecs338_hw01.o
gcc eecs338_hw01.o -o eecs338_hw01
Undefined symbols for architecture x86_64:
"_cuserid", referenced from:
_cuserid_wrapper in eecs338_hw01.o
(maybe you meant: _cuserid_wrapper)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [eecs338_hw01] Error 1
最佳答案
您应该设置#define _XOPEN_SOURCE 700
(或600),而不是简单地定义它。但是,这不会影响链接,只会影响符号在标题中是否可见。
在 Mac OS X 上运行 man cuserid
显示该函数没有手册页。
使用我的常规选项编译您的代码:
gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
-Wold-style-definition -Werror cuserid.c -o cuserid
要求我对您的代码进行一些细微的更改。这些函数被设为静态
,因此不需要单独的原型(prototype),并且函数定义使用显式void
来指示没有参数:
char* cuserid_wrapper(void)
而不是:
char* cuserid_wrapper()
这些都是相对较小的问题(当您不使用如此严格的编译选项进行开发时或多或少是正常的)。进行这些更改后,我被告知 sleep_wrapper()
和 waitpid_wrapper()
已定义但未使用(再次证明这不是 MCVE)。我还得到:
cuserid.c:33:17: error: implicit declaration of function 'cuserid' [-Werror=implicit-function-declaration].
鉴于此,链接失败也就不足为奇了;系统不知道 cuserid()
函数。我发现 cuserid()
当前不属于 POSIX 的一部分。 cuserid()
的 Linux 手册页注释:
System V has a
cuserid()
function which uses the real user ID rather than the effective user ID. Thecuserid()
function was included in the 1988 version of POSIX, but removed from the 1990 version. It was present in SUSv2, but removed in POSIX.1-2001.
cuserid()
函数不可移植,并且无法移植到 Mac OS X。
关于c - 使用 Make 编译 C 代码时出错 'ld: symbol(s) not found for architecture x86_64',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35118110/
这个问题在这里已经有了答案: Why don't Java's +=, -=, *=, /= compound assignment operators require casting? (11 个
我搜索了很多,但没有一个链接能帮助我解决这个问题。我得到了 ORA-21500: internal error code, arguments: [%s], [%s], [%s], [%s], [%s
我正在做 RegexOne 正则表达式教程,它有一个 question关于编写正则表达式以删除不必要的空格。 教程中提供的解决方案是 We can just skip all the starting
([\s\S]+|\s?) 中 |\s? 的目的或作用是什么?如果没有它,表达式会不会与 ([\s\S]+) 相同? 最佳答案 这不是完全相同的。 ([\s\S]+|\s?) 会匹配空字符串,而 ([
这个正则表达式有一组还是两组? 我正在尝试使用第二组访问 bookTitle 但出现错误: Pattern pattern = Pattern.compile("^\\s*(.*?)\\s+-\\s+
在 C 中给定一个字符串指针 s,下面的迭代会做什么?即它以什么方式遍历字符串? for (++s ; *s; ++s); 最佳答案 for (++s ; *s;++s) 表示 将指针 s 递增到字符
我正在用一个 node.js 应用程序解析一个大列表并有这段代码 sizeCode = dbfr.CN_DESC.split('\s+-\s*|\s*-\s+') 这似乎不起作用,因为它返回了 [ '
我正在编写一个简单的字符串连接程序。 该程序按照我发布的方式运行。但是,我首先使用以下代码编写它来查找字符串的结尾: while (*s++) ; 但是,这个方法并没有奏效。我传递给它的字符串
这个问题已经有答案了: What does (?和aramchand来自Mohandas Karamchand G 因此,在使用这些匹配来分割字符串后,您最终会得到 {"M", "K", "G"} 注
我正在尝试转换 Map到 List使用 lambda。 本质上,我想将键和值与 '=' 连接起来之间。这看起来微不足道,但我找不到如何去做。 例如 Map map = new HashMap<>();
我正在经历 K & R,并且在递增指针时遇到困难。练习 5.3(第 107 页)要求您使用指针编写一个 strcat 函数。 在伪代码中,该函数执行以下操作: 将 2 个字符串作为输入。 找到字符串
在下面的代码中,pS 和 s.pS 在最后一行是否保证相等?也就是说,在语句S s = S();中,是否可以确定不会构造一个临时的S? #include using namespace std; s
演示示例代码: public void ReverseString(char[] s) { for(int i = 0, j = s.Length-1; i < j; i++, j--){
我一直在寻找类似于 .NET examples 中的示例的 PowerShell 脚本.取一个 New-TimeSpan 并显示为 1 天 2 小时 3 分钟 4 秒。排除其零的地方,在需要的地方添加
def func(s): s = s + " is corrected" return s string_list = ["She", "He"] for s in string_li
我是 python 的新手。当我在互联网上搜索 lambda 时。我在 lambda_functions 中找到了这个声明. processFunc = collapse and (lambda s:
我最近开始学习正则表达式,并试图为上面的问题写一个正则表达式。如果限制只放在一个字母上(例如不超过 2 个“b”),这并不困难。 那么答案就是:a* c*(b|ε)a* c*(b|ε)a* c* 但是
当我运行 npm install 时出现以下错误,但我无法修复它。 我试过:npm install -g windows-build-tools 也没有修复这个错误 ERR! configure
有很多有趣的haskell网上可以找到片段。 This post可以在 this (awesome) Stack Overflow question 下找到. The author写道: discou
我知道以下三行代码旨在将字符串提取到$ value中并将其存储在$ header中。但是我不知道$value =~ s/^\s+//;和$value =~ s/\s+$//;之间有什么区别。 $val
我是一名优秀的程序员,十分优秀!